c# - 异步运行两个任务

标签 c# .net 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);
}

为此我需要:

  1. DoWork1DoWork2 是异步的;
  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);
}

那么,第一个问题: 我用两种不同的方式写了同样的东西吗?

第二个问题。我必须每隔 X 次运行 MyFunc 方法,所以我这样调用它:

Task.Factory.StartNew(MyFunc);

我可以简单地调用它吗

MyFunc();

我的问题是因为在 myFunc 中我有一个 Thread.Sleep。我可以让主线程休眠还是让主线程休眠更好?

希望我已经说清楚了。 谢谢。

最佳答案

Have I written same thing in two different ways?

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

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

Can I let sleep the main thread or is better to let sleep a thread inside the main?

这取决于您的应用程序在做什么。您可以将 MyFunc 变为 async,这样您就可以使用 Task.Delay,它在内部使用一个 timer 并且不阻塞(如果需要,你也可以传递一个 CancellationToken):

public async Task MyFuncAsync()
{
   // Do work

   await Task.Delay(syncInterval);
}

旁注:

在我看来,您可能正在使用同步之上的异步which in general is a questionable approach .我建议不要这样做。

相反,就像在您的第一个示例中一样,对这些工作人员显式调用 Task.Run:

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

    await Task.WhenAll(new[] { firstTask, secondTask });
    await Task.Delay(syncInterval);
}

关于c# - 异步运行两个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212742/

相关文章:

c# - 需要默认访问器 : Custom ConfigurationSection

c# - 在.net/c#中调用Marketo Rest Api的示例代码

c# - 错误 XDG0008 : NumberBox is not supported in a Universal Windows Platform project

java - 指定在多核系统中使用的 CPU 数量

c# - 在 C# 中为 Dapper 创建动态类型

.net - MSI 安装程序文件名中的 Exe 版本 (VS 2010)

.net - 使用systemdiagnostics.process在Powershell中运行后台作业

c# - 使用 if 语句遍历数据表并修改值

java - JPA 多线程 org.eclipse.persistence.exceptions.ConcurrencyException

android - 如何从 UI 线程运行特定类型的任务?