我必须做些什么来使我的方法等待?
我怎样才能推出我自己的asynchronous等待方法?
我发现在某些情况下编写asynchronous方法很容易:
private async Task TestGeo() { Geolocator geo = new Geolocator(); Geoposition pos = await geo.GetGeopositionAsync(); double dLat = pos.Coordinate.Latitude; double dLong = pos.Coordinate.Latitude; }
…但是,不幸的是,也可以看到,不是任何方法都可以做到asynchronous无聊, 机智:这不起作用:
private async Task TestAsyncAwait() { int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5); }
它阻止了我的编译错误,“不能等待int”; 在devise时间的一个提示同样告诉我,“types”int“不等于”
我也试过这个结果:
Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
我必须做些什么来使我的方法等待?
UPDATE
作为中后卫和S. Cleary表示(与曾经在KNBR上的猫有任何关系?),这是有效的:
int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));
也就是说,它编译 – 但它永远不会“移动”。
在运行时,它告诉我我应该“等待”CALL到TestAsyncAwait(),但是如果我这样做,它根本不会编译…
你只需要返回一个等待。 Task
/ Task<TResult>
是常用的select; 可以使用Task.Run
(在后台线程上执行代码)或TaskCompletionSource<T>
(包装一个asynchronous事件)来创buildTask
。
阅读基于任务的asynchronous模式以获取更多信息。
你的方法
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,请replaceTasktypes:
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); }