我正在尝试在NET4.0中转换以下代码
我该怎么做 ?请给我帮助
我只有VS 2010并且无法更改NET版本(坚持使用4.0版本)
我试图将第二种方法转换为下面的方法,但它并没有在
Task<IEnumerable<IEnumerable<Video>>> GetVideosAsync()
{
var allVideosTasks = new List<Task<IEnumerable<Video>>>();
foreach (var url in sources)
{
allVideosTasks.Add(DownloadDataAsync(url));
}
var context = TaskScheduler.FromCurrentSynchronizationContext();
var allVideos = Task.Factory.ContinueWhenAll(
allVideosTasks.ToArray(), result =>
{
int element = result.Count();
Console.WriteLine("Task={0}, Thread={1} (ContinueWhenAny): number element = {2}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId, element);
var resu = result[0].Result;
}, CancellationToken.None, TaskContinuationOptions.None, context);
return (Task<IEnumerable<IEnumerable<Video>>>)allVideos;
}
/********* CODE NET4.5 ***********/
public Task<ActionResult> Async()
{
var sw = Stopwatch.StartNew();
var data = GetVideosAsync();
sw.Stop();
ViewBag.Elapsed = sw.ElapsedMilliseconds;
return View("~/views/home/index.cshtml", data);
}
async Task<IEnumerable<IEnumerable<Video>>> GetVideoAsync()
{
var allVideos = new List<IEnumerable<Video>>();
foreach (var url in sources)
{
allVideos.Add(await DownloadAsync(url)); // downloading content from internet
}
}
答案 0 :(得分:0)
无需完全重写代码,您可以通过nuget安装Microsoft.Bcl.Async软件包。 http://www.nuget.org/packages/Microsoft.Bcl.Async
此软件包使Visual Studio 2012项目能够使用新的“异步”项目。和等待&#39;等待&#39;关键字。该软件包还包括基于任务的扩展方法,允许使用一些现有的异步API和新的语言关键字。
支持的平台:
- .NET Framework 4(包含KB2468871)
答案 1 :(得分:0)
尝试使用以下.NET 4.5版本的代码。在Async
方法中,您需要await
GetVideosAsync
的结果是为了获得完整的视频列表,因此方法也需要标记为async
。
public async Task<ActionResult> Async()
{
var sw = Stopwatch.StartNew();
var data = await GetVideosAsync();
sw.Stop();
ViewBag.Elapsed = sw.ElapsedMilliseconds;
return View("~/views/home/index.cshtml", data);
}
async Task<IEnumerable<IEnumerable<Video>>> GetVideosAsync()
{
var allVideosTasks = new List<Task<IEnumerable<Video>>>();
foreach (var url in sources)
{
allVideosTasks.Add(DownloadDataAsync(url));
}
await Task.WhenAll(allVideosTasks.ToArray());
return allVideosTasks.Select(x => x.Result);
}