首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步框架TaskEx.Delay问题

异步框架TaskEx.Delay问题
EN

Stack Overflow用户
提问于 2011-06-02 17:11:36
回答 2查看 1.5K关注 0票数 1

我在TaskEx.Delay中使用异步框架CTP调用C#时发现了一些问题

代码语言:javascript
复制
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应用程序。不用拖延,它工作得很好。

EN

回答 2

Stack Overflow用户

发布于 2011-06-02 17:15:12

这可能是因为您在控制台应用程序中运行,而不是在Windows应用程序中运行。

由于没有同步上下文,异步在控制台应用程序中的行为与在Windows窗体、WPF或WCF应用程序中的行为不同。因此,等待返回到线程池线程,而实际上并不“等待”执行。

如果您在WPF或Windows窗体应用程序中运行此程序,它将按预期运行。

另外,您的方法过于复杂。你可以这样做:

代码语言:javascript
复制
public async Task<string> TestAsync() {
    await TaskEx.Delay( 1000 );
    return "test";
}

实际上,这将与以前的方法一样工作,但是开销要小得多(而且要简单得多)。

票数 2
EN

Stack Overflow用户

发布于 2011-06-02 17:16:45

这是因为方法Test确实是一种异步方法。C#编译器只允许您通过具有void返回类型来隐藏它。因此,如果您的主方法如下所示

代码语言:javascript
复制
public static void Main() {
  Test();
}

然后,它实际上并不是运行Test并等待它完全完成。相反,它实际上是在调度Test运行,而且它的完成将在将来的某个时候发生。因此,您看到不同的输出是有意义的,因为它与时间有关。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6217771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档