我正在研究一個具有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
根本就沒有任何好處嗎?
爲什麼downvote?這是一個真正的問題,我會愉快地重新格式化,並且我正在努力尋找全面的簡潔資源。 – Softerware