【发布时间】:2011-09-10 12:47:37
【问题描述】:
我正在编写一些代码,其中 计时器每秒滴答一次,并从 Webservice 获取数据并在 WInform 上显示,
不同时运行多个操作的最佳方法是什么?
如果之前的操作完成并且没有运行,则该操作应该运行。
代码是
public void loadbalance()
{
try { //Get Data from Internet }
catch { }
}
delegate void loadbalancedelegate();
public void loadBalanceAsync()
{
loadbalancedelegate worker = new loadbalancedelegate(loadbalance);
AsyncCallback LoadbalnceCallBack = new AsyncCallback(loadbalanceCompleted);
AsyncOperation async = AsyncOperationManager.CreateOperation(null);
worker.BeginInvoke(LoadbalnceCallBack,async);
}
public void loadbalanceCompleted(IAsyncResult result)
{
loadbalancedelegate worker = (loadbalancedelegate) ((AsyncResult)result).AsyncDelegate;
AsyncOperation async = (AsyncOperation)result.AsyncState;
worker.EndInvoke(result);
}
delegate void setControlsBalanceDelegate(BalanceOB ball);
void setControlsBalance(BalanceOB ball)
{
if (this.InvokeRequired)
this.Invoke(new setControlsBalanceDelegate(this.setControlsBalance), new
object[] { ball });
else
{ //Update Data on Form (Windows App)
}
}
【问题讨论】:
-
不应该运行还是应该等到前一个完成?
-
所有给出的答案都是有效的解决方案。但是,如果您需要快速而肮脏,最简单的方法可能是使用一个简单的布尔变量作为您的“锁”。在计时器滴答开始时将锁定设置为 true,并在结束时将其设置为 false。先检查锁,如果是真的,不要再做。准确地说,当您访问 lock 变量时,将其包装在一个临界区 (
i.e. lock(this) {...}) 中,这样就没有两个计时器滴答可以同时读取 lock 变量——尽管它基于一个具有大足够的滴答间隔,发生这种情况的可能性很小。
标签: c# .net winforms asynchronous