异步运行两个任务

Cic*_*cio 3 .net c# multithreading asynchronous async-await

我正在运行同步方法.在里面我必须运行两个大方法,所以我想以异步方式运行它们.我在想类似的东西

public void MyFunc()
{
    var doWorkTask_1 = DoWork1();
    var doWorkTask_2 = DoWork2();

    var result1 = await doWorkTask_1;
    var result2 = await doWorkTask_2;

    if(result1 == result2) 
       ....

    Thread.Sleep(syncInterval);
}
Run Code Online (Sandbox Code Playgroud)

要做到这一点,我需要:

  1. DoWork1并且DoWork2是异步的;
  2. MyFunc 也是异步的;

但没有方法是异步的!

所以我尝试用另一种方式做:

public void MyFunc()
{
    var doWorkTask_1 = Task.Run(() => DoWork1());
    var doWorkTask_2 = Task.Run(() => DoWork2());

    var result1 = doWorkTask_1.Result;
    var result2 = doWorkTask_2.Result;

    if(result1 == result2) 
       ....

    Thread.Sleep(syncInterval);
}
Run Code Online (Sandbox Code Playgroud)

所以,第一个问题:我是否以两种不同的方式写了同样的东西?

第二个问题.我必须MyFunc每隔X次运行一次该方法,所以我用这种方式调用它:

Task.Factory.StartNew(MyFunc);
Run Code Online (Sandbox Code Playgroud)

我可以简单地称呼它

MyFunc();
Run Code Online (Sandbox Code Playgroud)

我的问题是因为里面myFunc我有一个Thread.Sleep.我可以让主线程睡眠或者更好地让主线内的线程睡眠吗?

我希望我已经清楚了.谢谢.

Yuv*_*kov 6

我有两种不同的方式写同样的东西吗?

不.您的第一种方法将并行执行两个工作单元,并将异步等待第一个,然后是第二个.

你的第二种方法将并行执行两个工作单元,并将同步等待第一个,然后是第二个.

我可以让主线程睡眠或者更好地让主线内的线程睡眠吗?

这取决于您的应用程序正在做什么.你可以把MyFuncasync这样你就可以使用Task.Delay,而不是,它在内部使用定时器,并不会阻止(你也可以通过它CancellationToken,如果需要的话):

public async Task MyFuncAsync()
{
   // Do work

   await Task.Delay(syncInterval);
}
Run Code Online (Sandbox Code Playgroud)

边注:

在我看来,你可能正在使用异步过度同步,这通常是一个值得怀疑的方法.我会反对它.

相反,就像在第一个示例中一样,明确调用Task.Run这些worker:

public async Task MyFuncAsync()
{
    var firstTask = Task.Run(() => DoWork1());
    var secondTask = Task.Run(() => DoWork2());

    await Task.WhenAll(new[] { firstTask, secondTask });
    await Task.Delay(syncInterval);
}
Run Code Online (Sandbox Code Playgroud)

  • @Ciccio不,你不能.但是你可以使用[*初始化模式*](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html) (2认同)