本帖最后由 caozhy 于 2011-09-19 23:29:24 编辑

解决方案 »

  1.   

    开始我试图在一个控制台程序中实现异步语法,但是发现没有办法运行。无论是我的代码还是微软的Demo,都是如此,虽然可以编译,但是主程序会直接返回,而异步方法似乎没有执行。即便在主程序里面使用Task.Wait()也无济于事。这个问题直到现在仍然没有解决,估计和控制台程序的线程模型有关,如果谁知道原因,请指教下,谢谢!-----------async void Main() {  await ... } 的代码么?我好像也遇见过,好像拎出一个static方法再调用就OK了。
    回头找找。
      

  2.   

    本帖最后由 caozhy 于 2011-09-20 00:04:51 编辑
      

  3.   

    吼吼,那是vs11对async有所改变了吧。下面的代码在vs2010 ctp里正常,Main方法顶多是有个warn,执行结果也OK
      

  4.   

    是的,这两者确实有不少差异。
    比如说,在Async CTP里面,那些 xxxAsync() 的方法都是靠扩展方法实现的,而在 VS11DP 里面,这些都被对应的库内置。再比如,在Async CTP里面,WaitAll() 在 TaskEx 类中,而在 VS11DP里面,也被移到了 Task 中。
      

  5.   

    哎, win 8 preview 时不时也是起不来啊明天整vs11
      

  6.   

    我的csdn相册里面有几张我拍的Windows Developer Preview照片。这东西完成度相当低,基本上就是做了一个Shell。无论是WPF绘制的菜单不伦不类,还是那个居然靠滚动条而不是直接拖动的界面。另外很多东西只是粗糙地堆砌了下,比如任务管理器,实际上原来的程序还在(有图为证)。
      

  7.   

    一点体会:Task based 的异步编程模型,异步的编程复杂度小了。对Task的设计要求高了。
      

  8.   

    你指的是 Metro UI ? 哈哈,不是tablet 当然不给力。要是拿到现场发的三星机器就爽了。
      

  9.   

    Async最大的用途就是配合WPF、SL和Windows vNext的程序设计。如我我之前所说,Cloud+Client的程序严重依赖延迟不确定的网络通讯,异步编程任务无所不在。为此能简化一点语法是很必要的。
      

  10.   

    建议楼主,不要用Linq的连缀写法,会让我们这些小菜头昏的。虽然我知道楼主是个Linq狂
      

  11.   

    想问一下 如果只调用一次怎么写对异步不是很了解昨天看了你的帖子了 特来求教
    这个例子里是调用了1次方法。如果只调用一次 那个task[]怎么给?
      

  12.   

    刚看了下返回值是T类型的数组,这个只能返回数组么?比如我要异步执行一个很夸张的函数 但只执行一次  取其结果有没有更好的办法?我现在是retrun的 result.First()
      

  13.   


    如果只调用1次,是这样的。int result = await Task.Factory.StartNew(() => foo(seed));
      

  14.   


    太感谢了英文不好 嘿嘿手头还没有文档。下载的WIN8 64位带的阉割版VS11。所以很多东西都靠猜测,刚刚还跟WaitAny较劲来着。谢谢了啊
      

  15.   

    .NET的多线程越来越好了。
    不过就是一直没有好的文档,这样不可能和Java竞争的。
      

  16.   


    另外,你还可以简化下 foo()修改成async Task<int> foo(int seed)
    {
        ...
        return i;
    }调用:
    int result = await foo(seed);
      

  17.   

    贴一下对照的.net4.0写法(console的)吧:using System;
    using System.Linq;
    using System.Threading;namespace ConsoleApplication1
    {
        class Program
        {
            public delegate string myString();        static void Main(string[] args)
            {
                ThreadPool.QueueUserWorkItem(h =>
                {
                    var query = from x in Enumerable.Range(0, 10).AsParallel()
                                select x + "->" + foo(unchecked((int)(DateTime.Now.Ticks >> x)));
                    Console.WriteLine("Result is: {0}.", string.Join(", ", query.ToArray()));
                });
                Console.ReadKey();
            }        private static int foo(int seed)
            {
                Random r = new Random(seed);
                string s = "";
                int i = 0;
                while (s != "this")
                {
                    char c1 = (char)r.Next(67, 122);
                    char c2 = (char)r.Next(67, 122);
                    char c3 = (char)r.Next(67, 122);
                    char c4 = (char)r.Next(67, 122);
                    s = new string(new char[] { c1, c2, c3, c4 });
                    i++;
                }
                return i;
            }
        }}
      

  18.   

    好文要顶啊。强大的wpf,还有4.0 啊
      

  19.   

    using System;
    using System.Linq;
    using System.Threading;namespace ConsoleApplication1
    {
        class Program
        {
            public delegate string myString();        static void Main(string[] args)
            {
                ThreadPool.QueueUserWorkItem(h =>
                {
                    var query = from x in Enumerable.Range(0, 10).AsParallel()
                                select x + "->" + foo(unchecked((int)(DateTime.Now.Ticks >> x)));
                    Console.WriteLine("Result is: {0}.", string.Join(", ", query.ToArray()));
                });
                Console.ReadKey();
            }        private static int foo(int seed)
            {
                Random r = new Random(seed);
                string s = "";
                int i = 0;
                while (s != "this")
                {
                    char c1 = (char)r.Next(67, 122);
                    char c2 = (char)r.Next(67, 122);
                    char c3 = (char)r.Next(67, 122);
                    char c4 = (char)r.Next(67, 122);
                    s = new string(new char[] { c1, c2, c3, c4 });
                    i++;
                }
                return i;
            }
        }}
      

  20.   


    如果我没理解错的话,个人认为,main不应该被标记成async.......
      

  21.   

    我一直用的是Winform不知有什么改进没有,楼主花点时间帮我看一下~!!
      

  22.   

    好久没关注楼主的.NET 4.5探秘系列了忙工作 一直看MEF。