2012-11-23 54 views
8

如果我有這樣的一個接口:異步programmic和虛擬功能

using System.Threading.Tasks; 

... 

public interface IFoo 
{ 
    Task doIt(); 

    Task<bool> doItAndReturnStuff(); 
} 

,並實現了這個接口恰好不需要異步方法的類之一,我怎麼能糾正覆蓋這些功能呢?

換句話說,我該如何正確地返回Task對象中包裝的「void」和「bool」?

例如:

public class FooHappensToNotNeedAsync : IFoo 
{ 
    public override Task doIt() 
    { 
    // If I don't return anything here, I get 
    // error that not all code paths return a value. 
    // Can I just return null? 
    } 

    public override Task<bool> doItAndReturnStuff() 
    { 
    // If I want to return true, how to I do it? 
    // This doesn't work: 
    return true; 
    } 
} 

注意 - 我不能完全剝離任務的東西,因爲一些實現這個接口類的,其實都是非同步

感謝

+0

'返回Task.Run(()=> TRUE);' –

+1

@ LB:這會產生額外的工作,沒有真正的理由,並且比返回已經完成的任務更難預測。 –

回答

15

目前尚不清楚你想要達到什麼樣的,但是一種方法(這看起來最像「正常」的代碼)可能只是讓他們異步方法無論如何:

public async Task DoIt() 
{ 
    // No-op 
} 

public async Task<bool> DoItAndReturnStuff() 
{ 
    return true; 
} 

沒有任何await表達式,該方法無論如何將同步完成。每種方法都會收到警告,但您可以使用#pragma來禁用該代碼。

或者 - 和我不要求#pragma禁用警告的方式猜測更簡單 - 是使用Task.FromResult

public Task DoIt() 
{ 
    // Returns a Task<bool>, but that's okay - it's still a Task 
    return Task.FromResult(true); 
} 

public Task<bool> DoItAndReturnStuff() 
{ 
    return Task.FromResult(true); 
} 
+0

上面的第一個代碼片段 - 「可能只是爲了讓它們成爲異步方法」 - 不會編譯。這就是爲什麼我問這個問題。你會得到「錯誤CS0161:不是所有的代碼路徑都返回一個值」。我想這就是爲什麼你有一個小snarky評論:)。但是,你的第二個片段,尤其是DoIt()的實現,正是我尋找的那種黑客。非常感謝! – swinefeaster

+1

@swinefeaster:如果包含async修飾符,第一個版本應該可以編譯。你確定你做到了嗎?當我回到電腦時會再次檢查。 –

+1

@swinefeaster:我只是試過了,沒關係 - 雖然我不得不在移除'override',因爲它實現了一個接口,而不是覆蓋基類的方法。我只有CS0161沒有'async'修飾符。 –