45

如何滚动我自己的异步等待方法?

我看到在某些情况下编写异步方法很容易:

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,但如果我这样做,它根本不会编译......

4

4 回答 4

28

您只需要返回一个可等待的。Task/Task<TResult>是常见的选择;Task可以使用Task.Run(在后台线程上执行代码)或TaskCompletionSource<T>(包装异步事件)来创建 s。

阅读基于任务的异步模式了解更多信息。

于 2012-11-22T19:53:20.460 回答
18

你的方法

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;
}
于 2015-06-04T17:24:08.770 回答
3
var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;
于 2014-03-11T21:43:36.060 回答
1

您需要消耗等待的回报或回报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);
    }
    
于 2012-11-22T20:42:00.507 回答