繁体   English   中英

Task.Run在回调C#.NET中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM