gpt4 book ai didi

c# - 将事件变成异步调用

转载 作者:太空狗 更新时间:2023-10-29 18:04:44 25 4
gpt4 key购买 nike

我正在包装一个库供我自己使用。要获得某个属性,我需要等待一个事件。我正在尝试将其包装到异步调用中。

基本上,我想转

void Prepare()
{
foo = new Foo();
foo.Initialized += OnFooInit;
foo.Start();
}
string Bar
{
return foo.Bar; // Only available after OnFooInit has been called.
}

进入这个

async string GetBarAsync()
{
foo = new Foo();
foo.Initialized += OnFooInit;
foo.Start();
// Wait for OnFooInit to be called and run, but don't know how
return foo.Bar;
}

如何最好地实现这一点?我可以循环等待,但我正在尝试寻找更好的方法,例如使用 Monitor.Pulse()、AutoResetEvent 或其他方法。

最佳答案

这就是 TaskCompletionSource 发挥作用的地方。新的 async 关键字在这里几乎没有空间。示例:

Task<string> GetBarAsync()
{
TaskCompletionSource<string> resultCompletionSource = new TaskCompletionSource<string>();

foo = new Foo();
foo.Initialized += OnFooInit;
foo.Initialized += delegate
{
resultCompletionSource.SetResult(foo.Bar);
};
foo.Start();

return resultCompletionSource.Task;
}

示例使用(花哨的异步)

async void PrintBar()
{
// we can use await here since bar returns a Task of string
string bar = await GetBarAsync();

Console.WriteLine(bar);
}

关于c# - 将事件变成异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963301/

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