2010-05-27 29 views
0

我正在寫一個包裝類,圍繞TcpClient,當數據到達時引發一個事件。我正在使用BeginReadEndRead,但是當父窗體處理該事件時,它不在UI線程上運行。我是否需要使用委託並將該上下文傳遞給回調?我認爲回調是避免這種方式...如何安全地在AsyncCallback中引發事件?

void ReadCallback(IAsyncResult ar) 
{ 
    int length = _tcpClient.GetStream().EndRead(ar); 
    _stringBuilder.Append(ByteArrayToString(_buffer, length)); 
    BeginRead(); 
    OnStringArrival(EventArgs.Empty); 
} 
+0

代表的問題是什麼? – 2010-05-27 06:18:30

回答

0

母體形式應該是使用其控制的Invoke方法在事件處理程序,以確保它是正確的線程上;遵守用戶界面所需要的不是你後臺進程的工作。 This msdn page有一個例子。

+0

但是不應該在它創建的同一個線程上引發事件嗎? – dlras2 2010-05-27 11:36:09

+0

開始* /結束*在獨立的線程上運行;如果你看看Visual Studio中的Threads視圖,它將被稱爲「Asynchronous method runner」。從這些線程的末尾調用AsyncCallback將會被這個線程調用,而不會是啓動它的線程。 – JustABill 2010-05-27 15:42:51