【发布时间】:2011-06-02 17:11:36
【问题描述】:
我在 C# 中使用异步框架 CTP 调用 TaskEx.Delay 时发现了某种问题
public async Task<string> TestAsync() {
return await TaskEx.RunEx<string>( async () => { //in real app this is time consuming code so this line is so complex
await TaskEx.Delay( 1000 );
return "test;
} );
}
public async void Test {
var count = 0;
while( count < 100 ) {
var val = await TestAsync();
Console.WriteLine( val ); // in real app this line adds elements to observable collection binded to ListBox
count++;
}
}
控制台上的输出大多出现一次(有时是两到三次),但不像我预期的那样出现 100 次。
编辑:
它不是控制台应用程序(上面的代码已简化)它是 WP7 应用程序。不使用延迟它可以正常工作。
【问题讨论】:
-
这不是您正在运行的实际代码 - 您在非异步方法中等待。如果你能想出一个简短但完整的程序,那真的很有帮助。目前我无法使用编译器,但有了一个完整的应用程序,我至少可以有更多的机会来诊断正在发生的事情。
-
如果您认为 TaskEx.Delay 有问题,请尝试在控制台应用程序中显示它。
-
我很确定 - 从 Microsoft Visual Studio Async CTP 包中打开示例项目 (C# Windows Phone) Netflix。在 MainPage.xaml.cs 中的 LoadMoviesAsync 中添加 await TaskEd.Delay (1000),在 imageCount += movies.Length 正下方的 78 行附近;并将 pageCount 更改为 2 以更好地查看结果。启动应用程序在年份框中输入 2000 并上下移动列表中的项目。一段时间后,项目将停止加载,但仍有数百个。去掉Delay就没有问题了!
标签: c# frameworks asynchronous