回调中的Task.Run C#.NET

时间:2016-10-20 13:33:26

标签: c# .net task

假设我有一个如下所示的回调方法:

private void Callback_eventcalled(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        Process(e.value);
    });
}

当任务开始时,它是否会创建值的新副本?或者回调方法是否被阻止,直到它完成处理(这将首先打破对任务的需求)。我还没有找到一个好的测试方法。

1 个答案:

答案 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