【发布时间】:2020-07-25 13:39:49
【问题描述】:
我正在学习 c# 中的任务和async/await。所以请考虑我的问题的愚蠢性。
班级中有一个事件DummyEvent。一个事件处理器DummyEventHandler订阅了这个event,它处理了大量的CPU密集型任务,实际上不需要这么频繁地使用。
因此,如果DummyEvent 被连续触发,我希望DummyEventHandler 以降低的频率响应,或者在连续性结束时响应。
所以,我的想法是将大型任务提取到一个单独的任务中,并使其在继续之前延迟 500 毫秒。延迟结束后,会检查同一个Task是否再次被调度(连续事件触发),如果为true则避免大计算。
这是我对这个想法的幼稚实现:
int ReducedCall = 0;
int TotalCallActual = 0;
protected void DummyEventHandler(object sender, bool arg)
{
TotalCallActual++;
LargeCPUBoundTask(); // there is a green underline here, but I think it's ok, or.. is it?
}
async Task LargeCPUBoundTask()
{
ReducedCall = TotalCallActual;
await Task.Delay(500);
// if this task is called again in this time, TotalCallActual will increase
if (ReducedCall == TotalCallActual)
{
// do all the large tasks
……
ReducedCall = 0;
TotalCallActual = 0;
}
}
但问题是,我没有得到我想要的。 Task.Delay(500) 行实际上并没有 await ,或者,如果它确实在等待,那就是有问题,因为我经历了惊人的。
有什么更好的想法,或者有什么改进/更正吗?
询问任何其他信息。
谢谢
【问题讨论】:
-
您在谈论
MyTask下的绿线,但您没有在代码中包含任何以这种方式调用的方法。TotalCallActual和ReducedCall究竟是如何以及何时增加/减少的?以及如何创建一个我们可以实际测试的代码? -
@PeterBons 抱歉回复晚了,我已经更新了我的问题,
MyTask实际上是LargeCPUBoundTask,这是在简化问题时出错。每次调用DummyEventHandler时,TotalCallActual都会增加,行:TotalCallActual++;并在事件处理程序中减少。 -
没关系。我已经更新了答案
-
自从发布我的答案后,我创建了一个GitHub repository,其中包含测试和示例控制台应用程序的解决方案。它也可以通过 NuGet 获得(搜索 CVV.EventReducer)。
标签: c# async-await task-parallel-library