gpt4 book ai didi

c# - 如何在 C# 中触发事件之前阻塞

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

询问后this question ,我想知道是否可以等待事件被触发,然后获取事件数据并返回其中的一部分。有点像这样:

private event MyEventHandler event;
public string ReadLine(){ return event.waitForValue().Message; }
...
event("My String");
...elsewhere...
var resp = ReadLine();

请确保您提供的任何解决方案都直接返回值,而不是从其他地方获取。我在问上面的方法是否以某种方式可用。我知道Auto/ManuelResetEvent,但我不知道他们像我上面那样直接返回值。

更新:我使用MyEventHandler(包含一个Message 字段)声明了一个事件。我在另一个名为 ReadLine 的线程中有一个方法等待事件触发。当事件触发时,WaitForValue 方法(事件处理场景的一部分)返回包含消息的事件参数。然后 ReadLine 将消息返回给调用它的任何对象。

The accepted answerthat question我问我做了什么,但感觉不太对劲。在 ManuelResetEvent 触发和程序检索数据并返回数据之间,几乎感觉数据可能会发生某些事情。

更新:Auto/ManualResetEvent 的主要问题是它太容易受到攻击。线程可以等待该事件,然后在将其更改为其他内容之前没有给其他任何人足够的时间来获取它。有没有办法使用锁或其他东西?也许使用 get 和 set 语句。

最佳答案

如果当前方法是异步的,那么您可以使用 TaskCompletionSource。创建事件处理程序和当前方法可以访问的字段。

    TaskCompletionSource<bool> tcs = null;

private async void Button_Click(object sender, RoutedEventArgs e)
{
tcs = new TaskCompletionSource<bool>();
await tcs.Task;
WelcomeTitle.Text = "Finished work";
}

private void Button_Click2(object sender, RoutedEventArgs e)
{
tcs?.TrySetResult(true);
}

此示例使用的表单具有名为 WelcomeTitle 的文本 block 和两个按钮。单击第一个按钮时,它会启动单击事件,但会在等待行停止。当单击第二个按钮时,任务完成并且 WelcomeTitle 文本被更新。如果你也想超时然后改变

await tcs.Task;

await Task.WhenAny(tcs.Task, Task.Delay(25000));
if (tcs.Task.IsCompleted)
WelcomeTitle.Text = "Task Completed";
else
WelcomeTitle.Text = "Task Timed Out";

关于c# - 如何在 C# 中触发事件之前阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745848/

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