![](/img/trans.png)
[英]What exactly in an awaitable is being awaited? How do I make a Task properly?
[英]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>
private async Task<Geoposition> TestGeo() { Geolocator geo = new Geolocator(); return await geo.GetGeopositionAsync(); }
private async Task<int> TestAsyncAwait() { return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.