在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]));
});