gpt4 book ai didi

c# - C# 中的 Promise 等价物

转载 作者:IT王子 更新时间:2023-10-29 03:48:54 29 4
gpt4 key购买 nike

在 Scala 中,有一个 Promise 类可用于手动完成 Future。我正在寻找 C# 中的替代方案。

我正在写一个测试,我希望它看起来像这样:

// var MyResult has a field `Header`
var promise = new Promise<MyResult>;

handlerMyEventsWithHandler( msg =>
promise.Complete(msg);
);

// Wait for 2 seconds
var myResult = promise.Future.Await(2000);

Assert.Equals("my header", myResult.Header);

我知道这可能不是 C# 的正确模式,但我想不出一个合理的方法来实现同样的事情,即使模式有些不同。

编辑:请注意,async/await 在这里没有帮助,因为我没有要等待的任务!我只能访问将在另一个线程上运行的处理程序。

最佳答案

在 C# 中:

  • Task<T>是一个 future (或 Task 表示单位返回的 future )。
  • TaskCompletionSource<T>是一个 promise 。

所以你的代码会这样翻译:

// var promise = new Promise<MyResult>;
var promise = new TaskCompletionSource<MyResult>();

// handlerMyEventsWithHandler(msg => promise.Complete(msg););
handlerMyEventsWithHandler(msg => promise.TrySetResult(msg));

// var myResult = promise.Future.Await(2000);
var completed = await Task.WhenAny(promise.Task, Task.Delay(2000));
if (completed == promise.Task)
; // Do something on timeout
var myResult = await completed;

Assert.Equals("my header", myResult.Header);

“定时异步等待”有点笨拙,但在实际代码中也比较少见。对于单元测试,我只会进行常规的异步等待:

var promise = new TaskCompletionSource<MyResult>();

handlerMyEventsWithHandler(msg => promise.TrySetResult(msg));

var myResult = await promise.Task;

Assert.Equals("my header", myResult.Header);

关于c# - C# 中的 Promise 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38996593/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com