c# - 异步函数中的 TaskCompletionSource

标签 c# .net

我有这样一个功能:

public async Task<bool> DoSomething()
{
   var tcs = new TaskCompletionSource<bool>();

   // Here is the problem. I need to keep this line because I wait on something asynchronously, but the function must return bool and I can't just return tcs.Task
   while(something)
      await Task.Delay(100);

   someobject.somevent += () => {
      // do some sht
      tcs.SetResult(true);
   }

   // it doesn't work
   return tcs.Task;
}

这只是一个假代码,但我在真实情况下需要它。我想让 DoSomething 保持异步,但我也想在其中保留 Task.Delay/Sleep。我如何在仅返回任务的非异步函数中执行此操作?

更新:

这有效:

class Program
    {
        static TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();


        static Task<bool> Test()
        {
           // tcs = new TaskCompletionSource<bool>();
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Waiting...");
                Thread.Sleep(5000);
                Console.WriteLine("Setting result");
                if(tcs.TrySetResult(true))
                    Console.WriteLine("Result has been set");


            });

            return tcs.Task;
        }

        static async Task Test2()
        {
            Console.WriteLine("Starting awaiting");
            var result = await Test();
            Console.WriteLine(result.ToString());
        }

        static void Main(string[] args)
        {


            Test2();

            Console.ReadKey(false);

        }
    }

这不是

static async Task<bool> Test()
{
   // tcs = new TaskCompletionSource<bool>();
    Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Waiting...");
        Thread.Sleep(5000);
        Console.WriteLine("Setting result");
        if(tcs.TrySetResult(true))
            Console.WriteLine("Result has been set");


    });


    return await tcs.Task;
}

更糟糕的是,我已经在我的 Windows 窗体应用程序中测试了它并等待 tcs.Task 导致来自 System.Threading....dll 的奇怪崩溃

最佳答案

如果我理解正确(这很棘手,因为你的问题不是那么容易理解)你可以重述如下:

public async Task<bool> DoSomething()
{
   var tcs = new TaskCompletionSource<bool>();
   someobject.somevent += () => {
      // do some sht
      tcs.SetResult(true);
   }

   return await tcs.Task;
}

关于c# - 异步函数中的 TaskCompletionSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35158546/

相关文章:

c# - 从 MySql db 到 c# 的重复列,为什么?

c# - 如何异步初始化静态类

c# - 将事件重新提交到 rebus

c# - 如何使用 c#/cmd 将新行添加到 msi 文件的属性表

c# - 在程序集的命名空间内循环?

c# - 为什么调用 await 会过早地完成父任务?

c# - 如何为多个进程共享一个 SQL Server CE 数据库文件 (.sdf)?

.net - 如何在 Silverlight 应用程序中使用非 Silverlight 程序集?

.net - Powershell HTTPS REST api GET/POST

c# - 是否可以在 Windows Phone 7 中读取 .rar 或 .zip 文件?如何?