异步编程问题

时间:2011-12-08 05:04:39

标签: c# asynchronous async-ctp

我最近发现了CTP异步库,我想尝试编写一个玩具程序来熟悉新概念,但是我遇到了一个问题。

我相信代码应该写出来

Starting
stuff in the middle
task string

但事实并非如此。这是我正在运行的代码:

namespace TestingAsync
{
    class Program
    {
        static void Main(string[] args)
        {
            AsyncTest a = new AsyncTest();
            a.MethodAsync();
        }
    }

    class AsyncTest
    {
        async public void MethodAsync()
        {
            Console.WriteLine("Starting");
            string test = await Slow();
            Console.WriteLine("stuff in the middle");
            Console.WriteLine(test);
        }

        private async Task<string> Slow()
        {
            await TaskEx.Delay(5000);
            return "task string";
        }
    }
}

有什么想法吗?如果有人知道一些很好的教程和/或视频来展示这些概念,那就太棒了。

2 个答案:

答案 0 :(得分:5)

您正在调用异步方法,但只是让您的应用程序完成。选项:

  • Thread.Sleep(或Console.ReadLine)添加到Main方法,以便在后台线程上发生异步内容时可以睡眠
  • 让您的异步方法返回Task并从Main方法等待。

例如:

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        AsyncTest a = new AsyncTest();
        Task task = a.MethodAsync();
        Console.WriteLine("Waiting in Main thread");
        task.Wait();
    }
}

class AsyncTest
{
    public async Task MethodAsync()
    {
        Console.WriteLine("Starting");
        string test = await Slow();
        Console.WriteLine("stuff in the middle");
        Console.WriteLine(test);
    }

    private async Task<string> Slow()
    {
        await TaskEx.Delay(5000);
        return "task string";
    }
}

输出:

Starting
Waiting in Main thread
stuff in the middle
task string

就视频而言,我在今年早些时候在Progressive .NET上进行了异步会话 - the video is online。另外,我有一些blog posts about async,包括我的Eduasync系列。

此外,Microsoft的团队还有很多视频和博客文章。有关大量资源,请参阅Async Home Page

答案 1 :(得分:1)

你是在5000ms开始之前退出程序。