【发布时间】:2011-01-31 10:27:16
【问题描述】:
背景
我有一个用 C# 编写的网络应用程序。我的服务器程序有一个 UI 和几个通信线程,它们从 tcp 套接字读取并在控制器 UI 上显示消息。
与每个客户端的通信是通过单独的线程完成的。当我从一个客户端收到一些消息流时,该客户端的线程会在 UI 上写入,这是表单上的富文本框。
我调用表单的 SetTextHelper(string text) 方法。
看起来像这样
private delegate void MyTextUpdateHandler(string text);
public void SetTextHelper(string text)
{
BeginInvoke(new MyTextUpdateHandler(SetText), new object[] { text });
}
public setText(string text)
{
richtext.Text+= text;
}
问题
- 如果我使用 BeginInvoke,当我将大量数据流写入 UI 时,我的 UI 完全没有响应
- Invoke 解决了这个问题,但我读到对于多线程环境,其中许多 thereads 共享相同的资源 Invoke 可能导致死锁,我在大约 16 个线程之间共享公共 ichtextbox
- 我的情况有什么好的设计?
【问题讨论】:
标签: .net multithreading user-interface