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)
要做到这一点,我需要:
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);
}
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
.我可以让主线程睡眠或者更好地让主线内的线程睡眠吗?
我希望我已经清楚了.谢谢.
我有两种不同的方式写同样的东西吗?
不.您的第一种方法将并行执行两个工作单元,并将异步等待第一个,然后是第二个.
你的第二种方法将并行执行两个工作单元,并将同步等待第一个,然后是第二个.
我可以让主线程睡眠或者更好地让主线内的线程睡眠吗?
这取决于您的应用程序正在做什么.你可以把MyFunc
要async
这样你就可以使用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)