gpt4 book ai didi

c# - 异步运行两个任务

转载 作者:行者123 更新时间:2023-11-30 13:45:37 26 4
gpt4 key购买 nike

我正在运行同步方法。在它里面我必须运行两个大方法,所以我想异步运行它们。我在想类似的事情

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com