2016-10-20 3 views
-1

:タスクが開始されるとTask.Run

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

は、それは価値の新しいコピーを作成しますか?または、処理が終了するまでコールバックメソッドがブロックされています(これは最初のタスクの必要性を打ち破ります)。私は良いテスト方法を見つけていない。

+1

とすることができます.value'は値の型です。新しいコピーです。参照の場合、ブロックされずに同じオブジェクトを参照します。 – serhiyb

+0

は 'var tsk = Task.Run()'の終了時にコールバックを待つために返された値を変数に代入する必要があります( "tsk"という名前を付けてください)、 'tsk.Wait()' – Misiakw

答えて

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()が除去された場合、ブロッキングが存在しないであろうが、タスクは、呼び出し元のコード行の後に実行することができる、したがって `E場合、発呼者からiの値は依然として5

関連する問題