同步任务无效

时间:2016-05-16 10:31:16

标签: c# multithreading asynchronous task-parallel-library task

这些天我正在学习线程并且在创建同步和异步任务之间感到困惑。我写了一段代码并且它不起作用。可以有人给我提示这里有什么问题。

我知道这可能是一个简单的问题,但真的会帮助我获得这个概念。

我想要什么 - 同步任务1应仅在同步任务2和同步任务3异步后提供数据。

另外,我想通过任务而不是线程,如果有人可以提供帮助。

提前致谢。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
    public static void Main()
    {

        var syncTask1 = Task.Factory.StartNew(() =>
        {


            for (int ctr = 1; ctr <= 10; ctr++)
                Console.WriteLine(ctr.ToString() + "1");
        });
        var syncTask2 = new Task(() =>
        {


            for (int ctr = 1; ctr <= 10; ctr++)
            {
                Console.WriteLine(ctr.ToString() + "2");

            }


        });
        syncTask2.Start();

        var syncTask3 = Task.Factory.StartNew(() =>
        {


            for (int ctr = 1; ctr <= 10; ctr++)

            Console.WriteLine(ctr.ToString() + "3");
        });


      //  syncTask.RunSynchronously();


        Console.ReadLine();
    }
}

1 个答案:

答案 0 :(得分:0)

没有同步和异步任务。您可以同步或异步调用(或等待)任务,但任务是相同的。

如果您想同步等待任务,您应该执行以下操作:

Task t = Task.Factory.StartNew(() =>
{
    for (int ctr = 1; ctr <= 10; ctr++)
        Console.WriteLine(ctr.ToString() + "1");
});

t.Wait(); // waiting task synchronously

如果您想异步等待任务:

Task t = Task.Factory.StartNew(() =>
{
    for (int ctr = 1; ctr <= 10; ctr++)
        Console.WriteLine(ctr.ToString() + "1");
});

await t; // waiting task asynchronously

但在这种情况下,您应将方法标记为async - (async await usage

在你的例子中 - 要在第二和第三之后先等待,你应该这样做:

public static void Main()
{
    var syncTask2 = Task.Factory.StartNew(() =>
    {
        for (int ctr = 1; ctr <= 10; ctr++)
            Console.WriteLine(ctr.ToString() + "2");
    });

    syncTask2.Wait();// wait for second task finishing synchronously          

    var syncTask3 = Task.Factory.StartNew(() =>
    {
        for (int ctr = 1; ctr <= 10; ctr++)
            Console.WriteLine(ctr.ToString() + "3");
    });

    syncTask3.Wait(); // wait for third task finishing synchronously after second

    var syncTask1 = Task.Factory.StartNew(() =>
    {
        for (int ctr = 1; ctr <= 10; ctr++)
            Console.WriteLine(ctr.ToString() + "1");
    });

    syncTask1.Wait(); // wait for third task finishing synchronously after second and third

    Console.ReadLine();
}