【发布时间】:2011-08-28 19:01:12
【问题描述】:
我有一个服务器类,它基本上等待来自客户端的连接。在该类中,我创建了一个 NetworkStream 对象,以便能够从客户端接收字节。因为 NetworkStream.Read() 方法不是异步的(这意味着它将等到它从客户端读取字节以便继续执行类似于 messagebox 方法的代码),我必须在单独的线程中读取字节,以便如果程序恰好在等待读取数据,使用该程序的用户仍然可以与程序交互。
无论如何,该线程拥有很多对象。一个例子是我在那个类中有一个名为 log 的列表。我使用该列表来了解服务器的状态。也许它正在侦听连接,或者它的状态是“已连接”或“已断开”。
所以如果我这样做:
Server myServer = new Server("192.168.0.120","1300"...\\ I pass the appropite parameters in order to instantiate it
//...
.. then I am able to latter look at the log as
string foo = myServer.Log[0] for example.
因为我想知道日志何时更新,所以在服务器类上我创建了一个事件:
public delegate void onUpdateHandler(string newStatus);
public event onUpdateHandler onUpdate = delegate { };
然后我在 Server 类上触发事件:
onUpdate("waitingForConnection");
我使用以下方法接收这些事件:
但如果我尝试使用 newStatus 做某事,我会收到错误说明:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
那么我怎样才能传递一个带有事件的对象呢?
编辑
所以我也注意到,如果我这样做:
我也遇到了错误!
但是当我做同样的事情时,从一个按钮调用它:
// SERVER IS RUNNING BEFORE CALLING THIS METHOD
private void button3_Click(object sender, RoutedEventArgs e)
{
listView1.Items.Add("my own string");
}
我没有收到错误消息!
为什么我的事件出错,而使用常规按钮调用它时却没有出错。
【问题讨论】:
标签: c# wpf multithreading