gpt4 book ai didi

c# - 如何实现异步观察者模式或事件

转载 作者:行者123 更新时间:2023-11-30 15:59:16 24 4
gpt4 key购买 nike

我正在寻找一种方法来实现以下内容:

A 说:“哟,X 发生了。再见。”

其他人看到这一点并开始做一些工作。

换句话说,我想触发一个事件,然后让其他人以“一劳永逸”的方式处理它。

所以我研究了观察者模式:https://msdn.microsoft.com/en-us/library/dd783449(v=vs.110).aspx .然而这个例子是同步的,如果观察者需要很长时间来完成他们的工作,通知方法就会阻塞很长时间。

我还查看了如何引发事件:https://msdn.microsoft.com/en-us/library/9aackb16(v=vs.110).aspx .此示例也是同步的,并且当处理程序需要很长时间来处理事件时会长时间阻塞发送方。

我的问题是:

如何在 C# 中触发并忘记事件/消息/委托(delegate)?

最佳答案

也许你应该遇见Task Parallel Library (TPL) Dataflows .有一个数据流叫做 ActionBlock<TInput>这对你来说应该是一个好的开始:

The ActionBlock<TInput> class is a target block that calls a delegate when it receives data. Think of a ActionBlock<TInput> object as a delegate that runs asynchronously when data becomes available. The delegate that you provide to an ActionBlock<TInput> object can be of type Action or type System.Func<TInput, Task>[...]

因此,给一个Func<TInput, Task>怎么样?至 ActionBlock<TInput>执行异步的东西?我修改了在此 TPL Dataflow MSDN article 上找到的示例:

List<Func<int, Task>> observers = new List<Func<int, Task>>
{
n => Console.WriteLine(n),
n => Console.WriteLine(n * i),
n => Console.WriteLine(n * n / i)
};

// Create an ActionBlock<int> object that prints values
// to the console.
var actionBlock = new ActionBlock<int>
(
n =>
{
// Fire and forget call to all observers
foreach(Func<int, Task> observer in observers)
{
// Don't await for its completion
observer(n);
}
}
);

// Post several messages to the block.
for (int i = 0; i < 3; i++)
{
actionBlock.Post(i * 10);
}

// Set the block to the completed state
actionBlock.Complete();

// See how I commented out the following sentence.
// You don't wait actions to complete as you want the fire
// and forget behavior!
// actionBlock.Completion.Wait();

您可能还想看看 BufferBlock<T> .

关于c# - 如何实现异步观察者模式或事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41846888/

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