在回调C#.NET中运行
假设我有一个如下所示的回调方法:在回调C#.NET中运行,c#,.net,task,C#,.net,Task,假设我有一个如下所示的回调方法: private void Callback_eventcalled(object sender, EventArgs e) { Task.Run(() => { Process(e.value); }); } 当任务启动时,它是否会创建该值的新副本?或者回调方法在完成处理之前一直被阻止(这将首先打破对任务的需求)。我还没有找到一个好的测试方法 它是否创建该值的新副本 这取决于e.value的类型 这里的i是一个整
private void Callback_eventcalled(object sender, EventArgs e)
{
Task.Run(() =>
{
Process(e.value);
});
}
当任务启动时,它是否会创建该值的新副本?或者回调方法在完成处理之前一直被阻止(这将首先打破对任务的需求)。我还没有找到一个好的测试方法
它是否创建该值的新副本
这取决于e.value的类型
这里的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());
}
下面,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()
,则不会出现阻塞,但任务可能会在调用者中的代码行之后运行,因此,如果e.value
是值类型-新副本,则调用者的i
值仍可为5,if reference-它将引用同一个对象而不阻塞。若要在回调中等待var tsk=Task.Run()
的完成,您需要将它返回的值放入变量(假设它名为“tsk”)并调用tsk.wait()