2012-12-03 59 views
0

我正在向API添加異步功能。我有這樣的接口:「等待」可用的API

public interface IThing 
{ 
    bool Read(); 
    Task<bool> ReadAsync(); 
} 

調用者可以使用它異步像這樣:

using (IThing t = await GetAThing()) 
{ 
    while (await t.ReadyAsync(); 
    { 
     // do stuff w/the current t 
    } 
} 

有實現IThing類:

public class RealThing : IThing 
{ 
    public bool Read() 
    { 
     // do a synchronous read like before 
    } 

    public Task<bool> ReadAsync() 
    { 
     return _internal.ReadAsync(); // This returns a Task<bool> 
    } 
} 

這編譯和作品!但其他的例子更喜歡ReadAsync()此實現:

public async Task<bool> ReadAsync() 
{ 
    return await _internal.ReadAsync(); 
} 

由於主叫方將等待,爲什麼異步/等待API嗎?

+0

什麼是你的內部'ReadAsync()'實現什麼樣子的? –

+0

如果你希望它總是在'using'中使用,那麼'IThing'不應該'擴展IDisposable'?如果它實際上不是一個可隨意使用的資源,那麼它不應該用在''using''開頭。 – Servy

回答

4
public async Task<bool> ReadAsync() 
{ 
    return await _internal.ReadAsync(); 
} 

這是沒有必要的。它只會增加開銷,並不會帶來任何好處。

你的代碼是更好:

public Task<bool> ReadAsync() 
{ 
    return _internal.ReadAsync(); 
} 
+0

謝謝斯蒂芬 - 我在回答我的另一個問題時做到了這一點,因爲http://stackoverflow.com/questions/13651383/task-continuewith-confusion。那是因爲我完成任務之後我有什麼東西嗎? – n8wrl

+0

@ n8wrl正確,那是在另一個例子中阻止他做這件事的原因。 – Servy

+0

我看到了 - 等待機器比.ContinueWith()更安全。得到它了!謝謝! – n8wrl