2016-10-19 104 views
0

我正在研究一個具有async API的PCL(我是這個主題的新手)。從我在網上做的研究中,我對行爲和設計影響感到困惑。假設應用程序使用一些入口點API來封裝一些抽象底層來訪問文件。假設這段代碼正在運行客戶端。嵌套和繼承異步/任務

public interface IFileProcessor 
{ 
    Task ProcessFile(string filename); 
} 

public class MyFileProcessor : IFileProcessor 
{ 
    // Adapter can be SomeAdapter or SomeOtherAdapter 
    private IMyAdapter _adapter; 

    public Task ProcessFile(string filename) 
    { 
     File file = await _adapter.GetFileAsync(filename).ConfigureAwait(false); 

     // Some CPU bound operation 
     DoSomeWorkOnFile(file); 

     await _adapter.SaveAsync(file); 
    } 

    private void DoSomeWorkOnFile(File file) 
    { 
     // do some CPU heavy work here 
    } 
} 

internal interface IMyAdapter 
{ 
    Task<File> GetFileAsync(string filename); 
    Task SaveAsync(File file); 
} 

// Some adapter for a client that has an async API and is mainly I/O bound 
internal class SomeAdapter : IMyAdapter 
{ 
    private SomeClient _client; 

    public async Task<File> GetFileAsync(string filename) 
    { 
     // Fetch from server or something 
     return await _client.SearchForFileAsync(filename).ConfigureAwait(false); 
    } 

    public async Task SaveAsync(File file) 
    { 
     // Push to server or something 
     await _client.SaveFileAsync(file).ConfigureAwait(false); 
    } 
} 

但說我有沒有async API及其操作阻塞另一個適配器:

// Some adapter for a client that has no async API and is mainly I/O bound 
internal class SomeOtherAdapter : IMyAdapter 
{ 
    private SomeOtherClient _client; 

    // Don't declare as async since it can't await? 
    public Task<File> GetFileAsync(string filename) 
    { 
     // Read from disk or something 
     File file = _client.GetFile(filename); 
     return Task.FromResult(file); 
    } 

    public Task SaveAsync(File file) 
    { 
     // Write to disk or something 
     _client.Save(file); 
    } 
} 
  • 是否SomeOtherAdapter有任何業務實現IMyAdapter儘管行爲不同?
  • 讓IMyAdapter返回Task類型有什麼好處嗎?假定應用程序調用await MyFileProcessor.DoSomeWorkAsync(...),那麼爲什麼要讓適配器爲async
  • 這些操作主要是I/O綁定的,而不是CPU綁定的 - 是否會影響我如何設計這些組件的決定?

我知道在一個簡單的例子中很難捕捉到核心問題,所以我很抱歉,如果我給的例子太微不足道讓我的問題變得清晰。

紅利問題:如果MyFileProcessor不需要做任何CPU綁定工作,那麼使用async根本就沒有任何好處嗎?

+0

爲什麼downvote?這是一個真正的問題,我會愉快地重新格式化,並且我正在努力尋找全面的簡潔資源。 – Softerware

回答

1

SomeOtherAdapter是否有任何業務實現IMyAdapter儘管行爲差異?

是的。在處理接口時,返回任務的方法表明它可能是可能是是異步的。如果你有一個同步的真實(即非測試存根)實現,我會在接口本身的文檔中注意到方法調用可能實際上是同步的。

讓IMyAdapter返回任務類型有什麼好處嗎?假設應用程序調用等待MyFileProcessor.DoSomeWorkAsync(...),那麼爲什麼要讓適配器爲異步?

是的。您的第一個示例是使用異步I/O綁定操作,因此完成接口任務返回(即異步兼容)是非常重要的。

這些操作主要是I/O綁定,而不是CPU綁定 - 應該影響我如何設計這些組件的決定?

是的。任何時候你有一個可能異步實現的接口,它應該有這些方法的異步兼容簽名。

如果MyFileProcessor不需要執行任何CPU綁定工作,那麼使用async有什麼好處嗎?

我不明白這個問題;它似乎意味着異步應該用於CPU綁定的工作。但這與異步的工作方式相反。 async自然適用於I/O綁定的代碼,而不是CPU綁定的代碼。

您可能會喜歡我的async OOP博客系列。

+0

謝謝澄清。我已經仔細閱讀並發現了一些衝突的信息,說明「異步」對於引起混淆的CPU綁定或I/O綁定工作是否最佳。 – Softerware