首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Tasks.ContinueWith

C# Tasks.ContinueWith
EN

Stack Overflow用户
提问于 2016-04-19 19:54:23
回答 1查看 459关注 0票数 0

我正在尝试从异步方法执行两个不同的任务,但我的第二个任务应该只从第一个任务结束的地方开始。我尝试过使用ContinueWith,但没有成功。这是我的示例代码:

代码语言:javascript
复制
class Program
{
    static List<string> GlobalList1 = null;
    static List<string> GlobalList2 = null;

    static void Main(string[] args)
    {
        Task firstTask = new Task(DoFirstThing);
        firstTask.Start();
        firstTask.Wait();

        Task secondTask = firstTask.ContinueWith(o => DoSecondThing(), TaskContinuationOptions.ExecuteSynchronously);
        secondTask.Wait();

        Console.ReadKey();
    }

    public async static void DoFirstThing()
    {
        Console.WriteLine("Doing first...");

        Task t = new Task(FirstThing);
        t.Start();

        await t;
    }

    public async static void DoSecondThing()
    {
        Console.WriteLine("Doing second...");

        Task t = new Task(SecondThing);
        t.Start();


        await t;
    }

    private async static void FirstThing()
    {
        Console.WriteLine("In First..");

        Task t = new Task(() =>
        {
            List<string> list = new List<string>();

            for (int i = 0; i < 1000; i++)
            {
                list.Add(string.Format("Testing:{0}", i));
            }

            System.Threading.Thread.Sleep(2000);

            GlobalList1 = list;
        });

        t.Start();

        await t;
    }

    private async static void SecondThing()
    {
        Console.WriteLine("In Second...");

        Task t = new Task(() =>
        {
            GlobalList2 = new List<string>();
            for (int i = 0; i < GlobalList1.Count; i++)
            {
                GlobalList2.Add(GlobalList1[i].ToString() + " - testing");
            }
        });

        t.Start();
        await t;
    }
}

您可能会从控制台输出中注意到,任务会同时运行。有可能改变这种行为吗?

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 20:00:14

我的第二个任务应该只从第一个任务结束的地方开始

那么你应该真心地等待它的结束。目前,您还没有这样做。您正在等待DoFirstThing方法返回,但它将在完成等待t之前返回。

如果不是构造新的Task,然后调用Start(),而是调用Task.Run并提供Func<T>,则可以等待代理任务完成:

代码语言:javascript
复制
static void Main(string[] args)
{
    Task firstTask = Task.Run(DoFirstThing);
    firstTask.Wait();
    ...
}

public async static Task DoFirstThing()
{
    Console.WriteLine("Doing first...");

    Task t = Task.Run(FirstThing);

    await t;
}

private async static Task FirstThing() { ... }

现在,在FirstThing()异步操作真正完成之前,Wait()调用不会完成。

基本上,在几乎所有情况下都要避免使用async void方法。

这就是说:

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

https://stackoverflow.com/questions/36717611

复制
相关文章

相似问题

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