在C#中; 从后台线程检查更改的最有效方法是什么?

Dam*_*ien 5 c# multithreading task

我为每个网络通信创建一个线程,每当他们从客户端收到回复时,他们就会添加一个列表响应.我正在执行下面的任务,以查看是否有任何通信进入.它在屏幕上显示最新的通信.

Task task = new Task(
(() =>
 {
    int i = 0;
    while (true)
    {
        if (responses.Count > i){
            Debug.WriteLine(responses[i]);
            int index = Form.ActiveForm.Controls.IndexOfKey("responseBox");
            Form.ActiveForm.Invoke((MethodInvoker) (() => Form.ActiveForm.Controls[index].Visible = true));
            Form.ActiveForm.Invoke((MethodInvoker) (() => Form.ActiveForm.Controls[index].Text = responses[i]));
            i++;
        }
    }
 }));
task.Start();
Run Code Online (Sandbox Code Playgroud)

我的问题是; 我有更好的方法吗?对于那些经常不会发生的事情来说,让任务继续工作似乎是错误的.

编辑:我对C#很新,所以如果有明显的东西,请不要犹豫,指出来.

更新:

根据来自MS的顺利绕线链接的精彩教程,我在List的Add函数中添加了一个简单的事件.如此:

public delegate void ChangedEventHandler(object sender, EventArgs e);

public class listWithChanges<T> : List<T> 
{
    public event ChangedEventHandler Changed;

    protected virtual void OnChanged(EventArgs e)
    {
        if (Changed != null)
            Changed(this, e);
    }

    public new void Add (T item)
    {
        base.Add(item);
        OnChanged(EventArgs.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用委托添加到我的输出中

responses.Changed += ((o, e) => {
                                int index = Form.ActiveForm.Controls.IndexOfKey("responseBox");
                                Form.ActiveForm.Invoke((MethodInvoker) (() => Form.ActiveForm.Controls[index].Visible = true));
                                Form.ActiveForm.Invoke((MethodInvoker) (() => Form.ActiveForm.Controls[index].Text = responses[responses.Count - 1]));
                              });
Run Code Online (Sandbox Code Playgroud)

Gen*_*nos 4

活动将是一个很好的解决方案。

事件是观察者模式的实现,其中源(网络通信)警告观察者(在示例中调用任务的人)发生了某些事情。

它的效率要高得多,因为它不会在无限循环中浪费 CPU 使用量,该方法仅在客户端响应时执行。

C# 对事件有很好的支持,请考虑阅读MS 教程(最初由 Sidewinder94 发布)。