c# – 如何将突发事件缓冲为较少的结果操作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何将突发事件缓冲为较少的结果操作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2189字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何将突发事件缓冲为较少的结果操作](/upload/InfoBanner/zyjiaocheng/819/28e6aa2831dd402da0cef66bbc7d9e21.jpg)
我想将多个事件减少为单个延迟动作.在发生一些触发后,我预计会出现更多类似的触发器,但我不想重复产生的延迟动作.行动等待,给爆炸完成的机会.
问题:我怎样才能以优雅的可重复使用方式进行?
直到现在我使用属性标记事件并触发延迟操作,如下所示:
public void SomeMethod()
{
SomeFlag = true; //this will intentionally return to the caller before completing the resulting buffered actions.
}
private bool someFlag;
public bool SomeFlag
{
get { return someFlag; }
set
{
if (someFlag != value)
{
someFlag = value;
if (value)
SomeDelayedMethod(5000);
}
}
}
public async void SomeDelayedMethod(int delay)
{
//some bufferred work.
await Task.Delay(delay);
SomeFlag = false;
}
下面是一个较短的方法,但仍然不是通用的或可重用的…我想要一些简洁的包装动作和标志,并保持功能(在执行完成之前返回调用者(如今)).我还需要能够将对象引用传递给此操作)
public void SerializeAccountsToConfig()
{
if (!alreadyFlagged)
{
alreadyFlagged = true;
SerializeDelayed(5000, Serialize);
}
}
public async void SerializeDelayed(int delay, Action whatToDo)
{
await Task.Delay(delay);
whatToDo();
}
private bool alreadyFlagged;
private void Serialize()
{
//some buferred work.
//string json = JsonConvert.SerializeObject(Accounts, Formatting.Indented);
//Settings1.Default.Accounts = json;
//Settings1.Default.Save();
alreadyFlagged = false;
}
解决方法:
这是一个线程安全且可重用的解决方案.
您可以创建DelayedSingleAction的实例,并在构造函数中传递要执行的操作.我相信这是线程安全的,尽管在启动操作之前它会重新启动计时器的风险很小,但我认为无论解决方案是什么,风险都会存在.
public class DelayedSingleAction
{
private readonly Action _action;
private readonly long _millisecondsDelay;
private long _syncValue = 1;
public DelayedSingleAction(Action action, long millisecondsDelay)
{
_action = action;
_millisecondsDelay = millisecondsDelay;
}
private Task _waitingTask = null;
private void DoActionAndClearTask(Task _)
{
Interlocked.Exchange(ref _syncValue, 1);
_action();
}
public void PerformAction()
{
if (Interlocked.Exchange(ref _syncValue, 0) == 1)
{
_waitingTask = Task.Delay(TimeSpan.FromMilliseconds(_millisecondsDelay))
.ContinueWith(DoActionAndClearTask);
}
}
public Task Complete()
{
return _waitingTask ?? Task.FromResult(0);
}
}
请参阅此dotnetfiddle以获取从多个线程连续调用一个操作的示例.
https://dotnetfiddle.net/el14wZ
内容总结
以上是互联网集市为您收集整理的c# – 如何将突发事件缓冲为较少的结果操作全部内容,希望文章能够帮你解决c# – 如何将突发事件缓冲为较少的结果操作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。