2016-11-14 61 views
1

我正在與第三方DLL公開的方法返回TaskTask<T>。我對這個程序集或接口沒有任何控制權,並且我假定作者認爲所有的東西都需要是異步的,因爲方法的命名是* Async(),如下所示。如果您沒有任何異步代碼,您如何處理返回任務的第三方接口?

鑑於此,如果我實際上沒有任何異步代碼運行,我該如何正確實現接口?

public interface IFoo 
{ 
    Task DoWorkAsync(); 

    Task<int> GetValueAsync(); 
} 

我的嘗試是以下幾點:

public class FooBar : IFoo 
{ 
    public async Task DoWorkAsync() 
    { 
     // Do Some Work 

     await Task.Yield(); 
    } 

    public async Task<int> GetValueAsync() 
    { 
     // Do Some Work 
     var result = ...; 

     return Task.FromResult(result); 
    } 
} 

此外:

  • 有人撰文揭露僅返回Task/Task<T>方法正確嗎?
  • 作者使用* Async()後綴方法名稱是否正確?如果我編寫異步方法而不將異步添加到名稱,則代碼分析不會投訴。
+2

我會說調用方法'異步'是。明確而簡單,尤其是。當你升級並試圖保持向後兼容的方法'GetSomething'和'GetSomethingAsync'時。 – rbm

+0

我通常做你的兩種方法的前者。如果沒有什麼可以等待,那就沒有什麼可以等待了。似乎沒有必要,但第三方庫就是它們。 – David

+0

@大衛:沒有兩種方法顯示,這是兩種不同的方法,其中一種在技術上沒有返回,這就是爲什麼它只是「任務」而不是「任務」。 – michael

回答

3

如果您沒有異步工作要做,請不要包含async關鍵字。你的GetValueAsnyc功能幾乎是正確的,你只需要刪除async。對於您的DoWorkAsync,您不應將方法標記爲異步並返回完成的任務。

public class FooBar : IFoo 
{ 
    public Task DoWorkAsync() 
    { 
     // Do Some Work 

     //If you can use .NET 4.6 
     return Task.CompletedTask; 

     //For older versions, the thing you pass in does not matter, I like to use bool. 
     return Task.FromResult(false); 
    } 

    public Task<int> GetValueAsync() 
    { 
     // Do Some Work 
     var result = ...; 

     return Task.FromResult(result); 
    } 
} 

但是,如果你的代碼是緩慢的,你最終會阻塞UI進行的很長一段時間,我會考慮在尋找,如果你可以重新寫你的代碼實際上是異步或者是包裝代碼在後臺線程中,但是如果它是最後的手段,我只會做一個後臺線程。