如何安全地在 AsyncCallback 中引发事件?
我正在围绕 TcpClient
编写一个包装类,它在数据到达时引发一个事件。我正在使用 BeginRead
和 EndRead
,但是当父窗体处理该事件时,它不在 UI 线程上运行。我是否需要使用委托并将上下文传递到回调中?我认为回调是避免这种情况的一种方法......
void ReadCallback(IAsyncResult ar)
{
int length = _tcpClient.GetStream().EndRead(ar);
_stringBuilder.Append(ByteArrayToString(_buffer, length));
BeginRead();
OnStringArrival(EventArgs.Empty);
}
I'm writing a wrapper class around a TcpClient
which raises an event when data arrives. I'm using BeginRead
and EndRead
, but when the parent form handles the event, it's not running on the UI thread. I do I need to use delegates and pass the context into the callback? I thought that callbacks were a way to avoid this...
void ReadCallback(IAsyncResult ar)
{
int length = _tcpClient.GetStream().EndRead(ar);
_stringBuilder.Append(ByteArrayToString(_buffer, length));
BeginRead();
OnStringArrival(EventArgs.Empty);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
父窗体应该在事件处理程序中对其控件使用
Invoke
方法,以确保它位于正确的线程上;后台进程的工作不是满足 UI 的需要。 此 msdn 页面 有一个示例。The parent form should be using the
Invoke
method on its controls in the event handler to ensure it's on the right thread; it's not the job of your background process to conform to what the UI needs. This msdn page has an example.