Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在回调C#.NET中运行_C#_.net_Task - Fatal编程技术网

在回调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()