我正在编写一些代码,在这些代码中,计时器每秒钟勾选一次,并从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)
}
}发布于 2011-09-10 12:59:19
您只需禁用计时器,直到一个操作完成为止,或者在完成时设置某个字段(由于多线程,最好使用ManualResetEventSlim )。
或者看一看反应性扩展--有很多这样的好例子。
您可以在这里找到许多示例:101个LINQ样本,非常好的intros在这里:反应性扩展初学者指南。最后,Somasegar有一篇与您的Rx问题非常相似的博客文章:.NET的反应性扩展 (webservice call of bingtranslate,您所需要的一切;)
发布于 2011-09-10 13:10:48
就用一次定时器。如果使用System.Timers.Timer,则将其AutoReset属性设置为false,并在运行事件处理程序结束时使用Start()重新启动它,通常是在一个finally块中。如果您使用System.Threading.Timer,那么用0来构造它。在回调中调用它的Change()方法来为它充电。
特别是在System.Timers.Timer的情况下,这样做是非常重要的。线程池线程的数量没有上限,它将开始调用经过的事件处理程序。如果机器被加载,它们可能需要一段时间才能真正开始运行。有足够的机会让不止一个人同时开始跑步。而且很难停止计时器。
发布于 2011-09-10 13:10:12
考虑在Task.Wait()命名空间中使用System.Threading.Tasks。
https://stackoverflow.com/questions/7371785
复制相似问题