2013-04-29 49 views
0

想要將任務鏈接到先前的實例(如果存在)。目前,兩者都在同一時間執行。如何將任務鏈接到它的前一個實例?

對於 一個任務工作

初始代碼:

private async void MenuMediaAddFiles_OnClick(object sender, RoutedEventArgs e) 
    { 
     var dialog = GetDefaultOpenFileDialog(); 
     using (dialog) 
     { 
      if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       using (var progress = new SimpleProgress(this)) 
       { 
        int addFiles = await _context.AddFiles(dialog.FileNames, progress); 
        Console.WriteLine("Files added: {0}", addFiles); 
       } 
      } 
     } 
    } 

一個失敗的嘗試,使其工作:

Task<int> _files; 
    private async void MenuMediaAddFiles_OnClick(object sender, RoutedEventArgs e) 
    { 
     var dialog = GetDefaultOpenFileDialog(); 
     using (dialog) 
     { 
      if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       using (var progress = new SimpleProgress(this)) 
       { 
        int addFiles; 
        Task<int> files = _context.AddFiles(dialog.FileNames, progress); 
        if (_files == null) 
        { 
         _files = files; 
        } 
        else 
        { 
         var task1 = await _files.ContinueWith(task => _context.AddFiles(dialog.FileNames, new SimpleProgress(this))); 
        } 

        addFiles = await _files; 
        Console.WriteLine("Files added: {0}", addFiles); 
       } 
      } 
     } 
    } 
+0

你是否需要'ContinueWith()'的'await'?沒有它會發生什麼? – 2013-04-29 18:37:06

+0

如果我刪除它,我仍然會得到相同的結果。 – Aybe 2013-04-29 18:41:59

+0

我很困惑你想要什麼樣的行爲。如果它存在,你是否想等待先前的任務?當前一個任務存在時,你想對從_context.AddFiles返回的任務做什麼? – 2013-04-29 18:48:58

回答

4

你是相當接近,但有一個需要幾件事情被修改:

private Task<int> previousTask = Task.FromResult(0); 
private async void MenuMediaAddFiles_OnClick(object sender, RoutedEventArgs e) 
{ 
    var dialog = GetDefaultOpenFileDialog(); 
    using (dialog) 
    { 
     if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      using (var progress = new SimpleProgress(this)) 
      { 
       previousTask = previousTask.ContinueWith(t => 
        _context.AddFiles(dialog.FileNames, progress)) 
        .UnWrap(); ; 

       int addFiles = await previousTask; 
       Console.WriteLine("Files added: {0}", addFiles); 
      } 
     } 
    } 
} 

注意事項:

  • 而不是讓以前的任務是null有時,它更容易將其初始化爲已完成的任務(Task.FromResult(0))。這避免了空檢查碼。

  • 您打了兩次電話AddFiles。您不應該在if之前調用它,並且您沒有將任務分配給if內的實例字段。

  • 我用UnWrap代替await打開Task<Task<int>>Task<int>。兩者都有效,但在這種情況下,我覺得UnWrap的意圖更清晰。

  • 請注意,由於整個事件處理程序將在UI線程中運行,因此不需要同步對previousTask的訪問,如果沒有,則需要進行一些鎖定。

+1

「有沒有必要同步訪問」那麼你爲什麼有'鎖'在那裏? – svick 2013-04-29 19:23:10

+1

@svick對,更新了我的代碼,忘了複製一遍,修復。 – Servy 2013-04-29 19:24:30

+0

非常好,謝謝! – Aybe 2013-04-29 21:56:55

相關問題