Ton*_*Nam 7 c# wpf multithreading
我有一个Server类,它基本上等待来自客户端的连接.在该类中,我创建了一个NetworkStream对象,以便能够从客户端接收字节.因为NetworkStream.Read()方法不是异步的(意味着它会等到它从客户端读取字节以继续执行类似于messagebox方法的代码),所以我必须在一个单独的线程中读取字节,以便如果程序恰好等待读取数据,则使用该程序的用户仍然可以与程序交互.
无论如何,该线程拥有许多对象.一个例子是我在该类中有一个名为log的List.我使用该列表来了解服务器的状态.也许它正在监听连接,或者它的状态是"连接"或"断开连接".
所以如果我这样做:
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.
Run Code Online (Sandbox Code Playgroud)
因为我想知道日志何时更新,在服务器类上我创建了一个事件:
public delegate void onUpdateHandler(string newStatus);
public event onUpdateHandler onUpdate = delegate { };
Run Code Online (Sandbox Code Playgroud)
然后,我在Server类上触发事件:
onUpdate("waitingForConnection");
Run Code Online (Sandbox Code Playgroud)
我用这个方法收到这些事件:

但如果我尝试用newStatus做一些事情,我会收到错误说明:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
Run Code Online (Sandbox Code Playgroud)
那我怎么能用事件传递一个对象呢?
编辑
所以我也注意到如果我这样做:

我也收到错误!
但当我做同样的事情时,从按钮调用:
// SERVER IS RUNNING BEFORE CALLING THIS METHOD
private void button3_Click(object sender, RoutedEventArgs e)
{
listView1.Items.Add("my own string");
}
Run Code Online (Sandbox Code Playgroud)
我没有收到错误!
为什么我在事件中遇到错误,并且在使用常规按钮调用时没有出错.
H.B*_*.B. 13
问题是线程试图访问DependencyObject具有线程亲和性的ListView ,使用Dispatcher在UI线程上执行这样的方法,例如:
Application.Current.Dispatcher.Invoke((Action)(() =>
{
listView1.Items.Add(newStatus);
}));
Run Code Online (Sandbox Code Playgroud)
另请参阅线程模型参考以获取其他信息.
| 归档时间: |
|
| 查看次数: |
10772 次 |
| 最近记录: |