【发布时间】:2019-01-25 21:01:54
【问题描述】:
如何创建一个异步结构,该结构将由一堆委托组成并弹出它们并每 N 毫秒调用它们中的每一个?
现在的问题是我有很多委托在 ui 上调用更改,这会导致 ui 冻结,所以如果堆栈不为空,如何让这个委托每 N 毫秒调用一次。
现在我有了这个
class CallbackRestriction
{
private Stack<KeyValuePair<Action<ImageWrapper>, ImageWrapper>> _callbackList =
new Stack<KeyValuePair<Action<ImageWrapper>, ImageWrapper>>();
public void AddCallback(Action<ImageWrapper> action, ImageWrapper payload)
{
_callbackList.Push(new KeyValuePair<Action<ImageWrapper>, ImageWrapper>(action, payload));
}
private async Task CallbackEmitLoop()
{
while (true)
{
await Task.Delay(TimeSpan.FromMilliseconds(20));
try
{
var callback = _callbackList.Pop();
callback.Key.Invoke(callback.Value);
}
catch (Exception e)
{
await Task.Delay(200);
}
}
}
}
但是我怎样才能让CallbackEmitLoop 在后台启动呢?或任何其他解决方案?
更新 1
我不需要 dispather 计时器,因为它与 wpf 紧密相关,也许对于“计时器”的事情,我应该使用同步上下文。而且我从其他上下文调用我的集合没有问题,因为集合可以准备好并发。我需要一个阀门之类的东西,一旦添加它们就会限制调用代表。所以我如何描述上面的问题我可以一次获得很多“更新”(代表),如果我只是应用它们(调用代表),ui线程将很忙,这将导致冻结,因此我应该以某种方式在应用下一次“更新”之前保持时间。
【问题讨论】:
标签: c# .net wpf asynchronous architecture