我正在运行同步方法。在它里面我必须运行两个大方法,所以我想异步运行它们。我在想类似的事情
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);
}
为此我需要:
DoWork1
和DoWork2
是异步的;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/