c# - 在所有任务完成之前防止异步方法返回

标签 c# .net multithreading asynchronous async-await

所以我仍在努力理解异步/等待模式,但我也在努力实现以下行为:

方法 A 调用运行多个进程的方法 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);
}

现在,发生的事情是一切如我所料,除了方法在一切完成之前返回,所以输出显示“程序完成”,而“两个”仍在运行。

我该如何编写,以便 CallProc() 可以异步执行这些任务,但延迟返回,直到一切都完成。也就是说,CallProc()需要异步运行一些任务,但是CallProc()本身需要同步调用。

最佳答案

您编写的异步方法的想法是,它将立即(大约)返回控制权,并且当它在概念上表示的操作完成时,它返回的任务将被标记为已完成。

这意味着您的程序应该查看生成的任务以查看它何时完成,或者您首先不想要异步方法,并且您应该重写 CallProc 同步而非异步。

要使 CallProc 同步,只需删除 async(并相应地调整返回类型),然后等待每个任务而不是使用 await

如果 CallProc 确实应该是异步的,那么调用者应该添加一个延续(或使用 await)来在任务完成时执行操作,而不是在任务完成时方法返回。

关于c# - 在所有任务完成之前防止异步方法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25024353/

相关文章:

用于找出不同可能组合的 C# 算法

c# - 如何将文本框数据绑定(bind)到列表<>中的特定索引

c++ - 跨线程共享读资源

ruby - 在 Ruby 中使用线程进行指标收集会产生大量开销吗?

c# - Repeater 中的 LinkBut​​ton 会导致回发,而按钮则不会

c# - 使用 Linq 从 C# 中的字典中删除具有相同值数据的多个键

c# - 条件编译题

java - 采访 : How to ensure that a thread runs after another?

c# - 查询抛出 "IndexOutOfRange"

c# - SetBounds 和 SetBoundsCore 有什么区别