2016-01-29 160 views
3

此刻我的代碼變得非常重複。我必須在整個軟件中反覆提高繁忙的指標。回調方法Task.Run()

的這三個動作是

1. Raise Busy Indicator 
2. Do the actions 
3. Turn Off Busy Indicator 

public async void OpenAttachment() 
{ 
    Events.PublishOnUIThread(new BusyEvent { IsBusy = true }); 
    await Task.Run(() => 
    { 
     try 
     { 
      if (SelectedAttachment == null) 
      { 
       return; 
      } 

      var tempFile = string.Format(
       "{0}\\{1}.{2}", Path.GetTempPath(), SelectedAttachment.FileName, SelectedAttachment.FileExtension); 

      System.IO.File.WriteAllBytes(tempFile, UnitOfWork.FileRepository.GetFileBytes(SelectedAttachment.Id)); 

      Process.Start(tempFile); 
     } 
     catch (Exception ex) 
     { 
      Notification.Error("Person - Opening attachment", "File couldn't open, please close last file instance."); 
     } 
    }); 
    Events.PublishOnUIThread(new BusyEvent { IsBusy = false }); 
} 

我期待運行的方法,使得它會而無需每次重複執行的忙閒指示。

喜歡的東西

public async void OpenAttachment() 
{ 
    Execute(() => await Task.Run(() => {....TaskWork}); 
} 

想,如果有人可以給我如何減少這種重複的代碼提示。

+1

它C#使用委託者...看看到實況... –

+0

如果你只需要回調,那麼你可以用好老'ContinueWith()'。 – abatishchev

+1

不要使用'async void',它只允許用來使您的方法簽名與事件處理程序兼容。你的函數看起來不是一個事件處理程序,所以它應該做'async Task'。 –

回答

8

你的意思是這樣的嗎?

public async Task RunBusyTask(Action task) 
{ 
    Events.PublishOnUIThread(new BusyEvent { IsBusy = true }); 
    await Task.Run(task); 
    Events.PublishOnUIThread(new BusyEvent { IsBusy = false }); 
} 

RunBusyTask(() => {...}); 
+1

我會讓它成爲'異步任務'而不是'asnyc void',所以你可以'等待RunBusyTask(()=> {...});'。 Asnyc void只能用於使您的方法簽名與事件處理程序兼容。 –

+0

@ScottChamberlain好點,除非你需要一個事件的方法,否則返回'Task'通常會更好。 – IllidanS4

+1

您應該只接受一個'Task'或'Func ',因爲該任務可能不代表CPU綁定的工作。 – Servy