簡體   English   中英

我必須做什么才能使我的方法可等待?

[英]What must I do to make my methods awaitable?

如何推出自己的異步等待方法?

我發現在某些情況下編寫異步方法很容易:

private async Task TestGeo()
{
    Geolocator geo = new Geolocator();
    Geoposition pos = await geo.GetGeopositionAsync();
    double dLat = pos.Coordinate.Latitude;
    double dLong = pos.Coordinate.Latitude;
}

...但遺憾的是,也不是任何方法都可以隨意異步; 即:這不起作用:

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}

...它阻止我編譯錯誤,“不能等待 int”; 設計時的提示同樣告訴我,“類型 'int' 不可等待”

我也嘗試過,結果相同:

    Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);

我必須做什么才能使我的方法可等待?

更新

正如 Linebacker 和 S. Cleary 指出的(與曾經在 KNBR 上的那只貓有任何關系?),這是有效的:

int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));

...也就是說,它會編譯——但它永遠不會“移動”。

在運行時,它告訴我應該“等待”對 TestAsyncAwait() 的 CALL,但如果我這樣做,它根本不會編譯......

你只需要返回一個 awaitable。 Task / Task<TResult>是常見的選擇; 可以使用Task.Run (在后台線程上執行代碼)或TaskCompletionSource<T> (包裝異步事件)創建Task

閱讀基於任務的異步模式了解更多信息。

你的方法

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}

應該這樣寫

private async Task TestAsyncAwait()
{
    Task<int> t = new Task<int>(() =>
    {
        return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    });
    t.Start();
    await t;
}

如果需要返回 int,請替換 Task 類型:

private async Task<int> TestAsyncAwait()
{
    Task<int> t = new Task<int>(() =>
    {
        return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    });
    t.Start();
    return await t;
}
var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;

您需要使用等待的返回或返回Task<Type of await call>

  1.  private async Task<Geoposition> TestGeo() { Geolocator geo = new Geolocator(); return await geo.GetGeopositionAsync(); }
  2.  private async Task<int> TestAsyncAwait() { return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM