2017-06-18 53 views
2

我的Xamarin.Forms應用程序有幾個接口(用於Dependency),其中包含Android和iOS的實現。它們中的方法不是異步的。現在我想爲UWP添加這些接口的實現,但是一些需要的方法是異步的,所以它們不適合簽名。我如何處理這個問題?是唯一爲UWP創建單獨界面的解決方案嗎?當Android和iOS不是異步時,如何處理UWP異步?

+0

值,你可以張貼代碼爲您的接口?沒有代碼時很難提供建議。 –

+0

像'string Method1();'這將需要在UWP:'任務 Method1();'。 – ispiro

+0

你可以爲所有3個平臺做異步接口嗎? –

回答

1

在這些場景中我傾向於使用Task.FromResult方法對於非異步實現。例如:在Windows上有一個方法返回一個類型爲bool的Task,並且你想在Android和iOS上爲返回bool的方法實現相同的功能。

public interface ISample 
{ 
    public Task<bool> GetABool(); 
} 

在Windows上,將只返回任務

public class WindowsSample : ISample 
{ 
    public Task<bool> GetABool() 
    { 
     // whatever implementation 
     return SomeTaskOfTypeBool(); 
    } 
} 

Android或iOS上,你會在包裝任務

public class AndroidSample : ISample 
{ 
    public Task<bool> GetABool() 
    { 
     // replace with however you get the value. 
     var ret = true; 
     return Task.FromResult(ret); 
    } 
} 
+1

這是個好主意。而不是嘗試同步異步,讓我們異步同步。如果你不能擊敗他們,加入他們。 :) – ispiro

+0

每當我看到有人打電話。結果在一個任務,我的一小塊死亡。 –

0

您不能使用await關鍵字。您必須創建一個新的任務並等待任務完成。一個單獨的界面是不必要的。使用任務進行異常處理可能會非常棘手,請告訴您自己。

調用異步方法方法1與返回值:

string s = Task.Run(() => Method1()).Result;

無返回值:

Task.Run(() => Method1()).Wait;

.Rest或.Wait塊,直到任務完成。

更多詳細信息: Calling async methods from non-async code

+1

你剛剛打開了一袋死鎖。 – Bart