Khi bạn nói không sử dụng đề trực tiếp, tôi giả sử bạn vẫn muốn sử dụng chúng gián tiếp qua các cuộc gọi async, nếu không điều này sẽ không thể rất hữu ích.
Tất cả những gì bạn cần làm là bọc các phương pháp không đồng bộ của Stream
và lưu kết quả vào bộ đệm. Trước tiên, hãy xác định một phần sự kiện của spec:
public delegate void MessageAvailableEventHandler(object sender,
MessageAvailableEventArgs e);
public class MessageAvailableEventArgs : EventArgs
{
public MessageAvailableEventArgs(int messageSize) : base()
{
this.MessageSize = messageSize;
}
public int MessageSize { get; private set; }
}
Bây giờ, đọc một 16-bit số nguyên từ con suối không đồng bộ và báo cáo lại khi nó đã sẵn sàng:
public class StreamWatcher
{
private readonly Stream stream;
private byte[] sizeBuffer = new byte[2];
public StreamWatcher(Stream stream)
{
if (stream == null)
throw new ArgumentNullException("stream");
this.stream = stream;
WatchNext();
}
protected void OnMessageAvailable(MessageAvailableEventArgs e)
{
var handler = MessageAvailable;
if (handler != null)
handler(this, e);
}
protected void WatchNext()
{
stream.BeginRead(sizeBuffer, 0, 2, new AsyncCallback(ReadCallback),
null);
}
private void ReadCallback(IAsyncResult ar)
{
int bytesRead = stream.EndRead(ar);
if (bytesRead != 2)
throw new InvalidOperationException("Invalid message header.");
int messageSize = sizeBuffer[1] << 8 + sizeBuffer[0];
OnMessageAvailable(new MessageAvailableEventArgs(messageSize));
WatchNext();
}
public event MessageAvailableEventHandler MessageAvailable;
}
Tôi nghĩ đó là về nó. Điều này giả định rằng bất kỳ lớp nào đang xử lý thư cũng có quyền truy cập vào Stream
và được chuẩn bị để đọc nó, đồng bộ hoặc không đồng bộ, dựa trên kích thước thư trong sự kiện. Nếu bạn muốn lớp người xem thực sự đọc toàn bộ thư thì bạn sẽ phải thêm một số mã để làm điều đó.
Anh ấy nói mà không cần sử dụng chủ đề !!! =) – Nayan
@Nayan: Asynchrony * là * đa luồng. Vấn đề này vốn là một trong đa luồng. Tôi nghi ngờ ý nghĩa của OP là anh ta không muốn tự tạo ra các chủ đề một cách rõ ràng. –
@Nayan: Tôi cho rằng OP đang tìm kiếm một giải pháp không tạo một Chủ đề mới rõ ràng và sử dụng phương pháp Đọc chặn, nhưng đối với một giải pháp không đồng bộ, không chặn. Bạn không thể có asynchronicity không có chủ đề. – dtb