假设我有一个如下所示的回调方法:
private void Callback_eventcalled(object sender, EventArgs e)
{
Task.Run(() =>
{
Process(e.value);
});
}
当任务开始时,它是否会创建值的新副本?或者回调方法是否被阻止,直到它完成处理(这将首先打破对任务的需求)。我还没有找到一个好的测试方法。
答案 0 :(得分:1)
是否会创建值的新副本
这取决于e.value
Passing Value-Type Parameters and Passing reference-Type Parameters
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()
被删除,则不会有阻塞,但是任务可能会在调用者的代码行之后运行,因此调用者的i
值仍然可以为5