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

B. *_*non 43 c# async-await windows-8 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;
}
Run Code Online (Sandbox Code Playgroud)

......但遗憾的是,不仅可以看到任何方法都可以在不知不觉中变得异步.说:这不起作用:

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}
Run Code Online (Sandbox Code Playgroud)

...它阻止了编译错误,"无法等待int"; 设计时的暗示同样告诉我,"类型'int'不是等待的"

我也尝试了同样的结果:

    Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
Run Code Online (Sandbox Code Playgroud)

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

UPDATE

正如Linebacker和S. Cleary所指出的那样(曾与KNBR上的那只猫有任何关系?),这有效:

int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*ary 26

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

阅读基于任务的异步模式以获取更多信息.


Jes*_*aya 17

你的方法

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}
Run Code Online (Sandbox Code Playgroud)

应该这样写

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

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

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

这里有更多解释.