我该怎样做才能使我的方法等待?

时间:2012-11-22 18:56:35

标签: c# windows-8 async-await windows-store-apps

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

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

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));

...也就是说,它编译 - 但它永远不会“移动”。

在运行时,它告诉我应该“等待”CALL到TestAsyncAwait(),但如果我这样做,它根本不会编译......

4 个答案:

答案 0 :(得分:26)

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

阅读Task-Based Asynchronous Pattern了解更多信息。

答案 1 :(得分:17)

你的方法

LIB_PRE virtual CJsonValue * Clone() = 0;

应该像这样写

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

如果需要返回int,请替换Task类型:

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

更多解释here

答案 2 :(得分:2)

var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;

答案 3 :(得分: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);
    }