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

在C#中;检查后台线程的更改最有效的方法是什么?,c#,multithreading,task,C#,Multithreading,Task,我为我的每个网络通信创建了一个线程,每当他们收到客户的回复时,他们就会将响应添加到列表中。我正在执行下面的任务,以查看是否有任何通信。它在屏幕上显示最近的一个 Task task = new Task( (() => { int i = 0; while (true) { if (responses.Count > i){ Debug.WriteLine(responses[i]); int i

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

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();
我的问题是,;有没有更好的方法让我这么做?在我看来,让任务不断地为一些不经常发生的事情工作是不对的

编辑:我对C#很陌生,所以如果有什么明显的事情,请毫不犹豫地指出

更新:

根据微软提供的sidewinder链接的尼斯教程,我在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);
    }
}

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

事件是该模式的一个实现,在该模式中,源(网络通信)向它的观察者(在您的示例中调用该任务的人)发出发生事件的警告

它的效率更高,因为它不会在无限循环中浪费CPU使用,该方法只在客户机响应时执行


C对事件有很大的支持,考虑阅读(最初由SouthReRel94发布)。

< P>如果你不想对代码进行大的重构,你可以为你的<代码>响应< /Cuff>集合使用一个阻塞队列,这样你的读取线程就在等待一个项目出现在队列中时阻止。p> 等待某个东西出现在阻塞队列中会消耗零CPU。(技术上非零,但不明显。)


快速搜索会得出这样的结果:

为什么不直接提出事件?因为我对c#不熟悉,也不知道你的意思:)事件是c#中进行此类操作的方式,如果你需要一个入门教程,这里是MS提供的:这看起来不像是一个背景工作者。它看起来像是一个仅用于主线程上的计时器的作业,或者是一个用于
响应
有新项时的事件。如果使用WPF,则可以使用绑定来显示列表,但这比事件稍微困难一些
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]));
                              });