MongoDB中的异步变更流

时间:2019-02-02 22:20:28

标签: c# mongodb

我想要听用于集合的改变流,而不会阻塞线程。

在ForEachAsync下面的代码中,它将永久阻止,并在发生更改时对其进行处理。

using (var cursor = await collection.WatchAsync())
{
    await cursor.ForEachAsync(change =>
    {
        // process change event
    });
}

我尝试删除“ await”并将其存储在变量中,但是在我实际上等待或稍后再执行.Wait()之前,将不会处理任何更改。

我希望即使我不等待任务,事件仍将得到处理。

该怎么办,这样我的整个程序就不会阻塞监听更改? 我正在考虑在包装一个新的线程的功能,但事实是否真的有必要吗?

2 个答案:

答案 0 :(得分:0)

我没有足够的声誉来评论(还),所以我以回答的形式提出反馈:

在这种情况下,您应该使用事件(侦听器,处理程序),而不是等待/异步。 如果没有更多关于您要完成的工作的信息,就很难对此进行详细说明。

答案 1 :(得分:-1)

所以,我发现以下方法适用...

static void Main(string[] args)
{
    Task watchTask = WatchCollection();

    // Do other stuff here, while watching...
}

private static async Task WatchCollection()
{
    using (var cursor = collection.Watch())
    {
        await cursor.ForEachAsync(change =>
        {
            // process change event
        });
    }
}

当我尝试这样做时,这是行不通的:

static void Main(string[] args)
{
    using (var cursor = collection.Watch())
    {
        Task watchTask cursor.ForEachAsync(change =>
        {
            // process change event
        });
    }

    // Do other stuff here, while watching
}

因此,实际的ForEachAsync任务正在等待,而包装整个功能的外部Task则没有等待...我太累了,或者对Tasks不够熟悉,无法很好地说明一个为什么工作而另一个工作没有。