Sin*_*tic 2 .net c# multithreading asynchronous async-await
所以我仍然试图理解async/await模式,但我也试图实现以下行为:
方法A调用方法B,该方法B运行许多进程.其中一些进程可以在不同的线程上运行,而其他事情正在处理中,这样它们的返回值将在需要时更接近.在完成所有这些过程之前,方法B不需要将控制权返回给调用者.
这是我正在使用的测试代码:
static void Main(string[] args)
{
CallProc();
Console.WriteLine("Program finished");
Console.ReadKey();
}
public static async Task CallProc()
{
var two = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(5000, "two"));
var one = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(500, "one"));
var three = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(1500, "three"));
// some process happens here
var oneMessage = await one; // waits until one finishes and then snags it's value
Console.WriteLine("Got message {0}", oneMessage);
// some more stuff happens here
var twoMessage = await two; // waits until two is finished and then snags it's value
Console.WriteLine(twoMessage);
// TODO: need to make sure that everything is completed before returning control to caller
}
public static string SomeSynchronousProcessIDontOwn(int delayTime, string message, bool delay = true)
{
Console.WriteLine("Starting \"{0}\"", message);
if(delay) Thread.Sleep(delayTime);
return string.Format("Finished \"{0}\"", message);
}
Run Code Online (Sandbox Code Playgroud)
现在,正在发生的事情是我所期望的所有单词,除了方法在所有内容完成之前返回,因此输出显示"程序完成"而"两个"仍在运行.
我如何编写这个,以便CallProc()可以异步执行这些任务,但延迟返回,直到一切都完成.换句话说,CallProc()需要异步运行某些任务,但CallProc()本身需要同步调用.
你所编写的异步方法的想法是它将立即返回控制(大约),并且当它在概念上表示的操作完成时,它返回的任务将被标记为已完成.
这意味着您的程序应该查看生成的任务以查看它何时完成,或者您首先不需要异步方法,并且应该CallProc同步重写而不是异步.
要使CallProc同步简单地删除async(并相应地调整返回类型),并等待每个任务而不是使用await.
如果CallProc确实应该是异步的,那么调用者应该await在任务完成时添加一个continuation(或using )来执行一个动作,而不是在方法返回时.
而不是单独等待每个任务,为什么不等待所有使用它们 WhenAll
public static async Task CallProc()
{
var two = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(5000, "two"));
var one = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(500, "one"));
var three = Task.Factory.StartNew(() => SomeSynchronousProcessIDontOwn(1500, "three"));
// run synchronous tasks
await Task.WhenAll(one, two, three);
}
Run Code Online (Sandbox Code Playgroud)
如果您希望有CallProc阻止(即在所有任务完成之前不返回),则删除async声明并Task.WaitAll改为使用.
public static void CallProc()
{
// start tasks
Task.WaitAll(one, two, three);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2900 次 |
| 最近记录: |