从不同的线程访问对象

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)

另请参阅线程模型参考以获取其他信息.