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)