[英]Task.Run in callback C# .NET
假设我有一个如下所示的回调方法:
private void Callback_eventcalled(object sender, EventArgs e)
{
Task.Run(() =>
{
Process(e.value);
});
}
任务启动时,是否创建值的新副本? 还是将回调方法阻塞,直到完成处理为止(这首先会中断对任务的需要)。 我还没有找到好的测试方法。
是否创建值的新副本
它取决于e.value
的类型
private void Button_Click_1(object sender, EventArgs e)
{
int i = 5;
Task.Run(() => Process(i)).Wait();
MessageBox.Show("From button_click: "+i.ToString());
}
public void Process(int w)
{
MessageBox.Show("From task-1: "+ w.ToString());
w++;
MessageBox.Show("From task-2: "+ w.ToString());
}
在这里, i
是一个整数,是一个值类型并按值传递,因此将进行复制,因此在Process()
进行的增量将不会在调用方中反映出来。
在下面, i
作为参考传递,因此Process()
的增量将反映回调用者中。
private void Button_Click_1(object sender, EventArgs e)
{
int i = 5;
Task.Run(() => Process(ref i)).Wait();
MessageBox.Show("From button_click: "+i.ToString());
}
public void Process(ref int w)
{
MessageBox.Show("From task-1: "+ w.ToString());
w++;
MessageBox.Show("From task-2: " + w.ToString());
}
如果删除了Wait()
,将不会有任何阻塞,但是Task可能会在调用方的代码行之后运行,因此,调用方的i
值仍然可以为5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.