2017-05-13 8 views
0

を待つ:非同期待つC#のロジックは、以下のWPF非同期私は非同期イベントをクリックし使用しようとしている

private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " click_begin"); 
    await changeProgressBarAsync(ProgresBar_mainLoad); 
    MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " click_end"); 
} 

public Task changeProgressBarAsync(ProgressBar pb) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " task"); 
     int count = 100; 
     while (count-- > 0) 
     { 
      pb.Dispatcher.Invoke(() => 
      { 
       pb.Value += 1; 
      }); 

      Thread.Sleep(10); 
     } 
    }); 
} 

を、ライン

MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " task"); 

MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " click_end"); 

は等しい示す必要がありますスレッドID、 このプログラムは私を表示します

  • 1 click_begin
  • 1 click_end

が、なぜそれが起こるタスク?

それはそれはそれはTestClick2 あるタスク

  • 3であるTestClick1
  • 3である私は

    static void Main(string[] args) 
    { 
        TestClick(); 
        Console.ReadKey(); 
    } 
    
    public static async void TestClick() 
    { 
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " it is TestClick1"); 
        await Worker(); 
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " it is TestClick2"); 
    } 
    
    public static Task Worker() 
    { 
        return Task.Factory.StartNew(() => 
        { 
         Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " it is Task"); 
        }); 
    } 
    

    コンソールアプリで同じテストを行なったし、それは私に

    • 1を表示
  • 答えて

    2

    あなたは明示的に新しいタスクを開始しています。 Task.Factory.StartNew()。ほとんどの場合、UI以外のスレッドで実行されます。

    非同期/これを行う方法は、ディスパッチャを使用しないで、代わりにThread.Sleepが、Task.Delayを使用しないように、別のスレッドで新しいタスクを開始するないで待っています。次に、あなたは持っていたでしょう:

    public async Task ChangeProgressBarAsync(ProgressBar pb) 
    { 
        MessageBox.Show(Thread.CurrentThread.ManagedThreadId + " task"); 
        int count = 100; 
        while (count-- > 0) 
        { 
         pb.Value++; 
         await Task.Delay(10); 
        } 
    } 
    

    余分なスレッドはどこにもありません。

    コンソールアプリケーションには、コンソールアプリケーションに同期コンテキストがないため、別のスレッドが表示されています。待機していたスレッドと同じスレッドで継続を実行するものはありません。

    +0

    ありがとうございます! –

    関連する問題