我想要听用于集合的改变流,而不会阻塞线程。
在ForEachAsync下面的代码中,它将永久阻止,并在发生更改时对其进行处理。
using (var cursor = await collection.WatchAsync())
{
await cursor.ForEachAsync(change =>
{
// process change event
});
}
我尝试删除“ await”并将其存储在变量中,但是在我实际上等待或稍后再执行.Wait()之前,将不会处理任何更改。
我希望即使我不等待任务,事件仍将得到处理。
该怎么办,这样我的整个程序就不会阻塞监听更改? 我正在考虑在包装一个新的线程的功能,但事实是否真的有必要吗?
答案 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不够熟悉,无法很好地说明一个为什么工作而另一个工作没有。