我为每个网络通信创建一个线程,在它们从客户端那里收到响应后,将响应添加到列表中。我在执行下面的任务以启动它,以查看是否有通信进来。它会在屏幕上显示最近的通信。
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提供的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);
}
}
并通过委托添加到我的输出中
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]));
});
responses
有新项时触发事件。 - LarsTech