首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止多异步操作

防止多异步操作
EN

Stack Overflow用户
提问于 2011-09-10 12:47:37
回答 5查看 1.6K关注 0票数 1

我正在编写一些代码,在这些代码中,计时器每秒钟勾选一次,并从Webservice获取数据并显示在WInform上,

实现而不是的最佳方法是同时运行多个操作?

如果上一次操作完成而未运行,则应运行操作。

代码是

代码语言:javascript
复制
  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)

        }
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-10 12:59:19

您只需禁用计时器,直到一个操作完成为止,或者在完成时设置某个字段(由于多线程,最好使用ManualResetEventSlim )。

或者看一看反应性扩展--有很多这样的好例子。

您可以在这里找到许多示例:101个LINQ样本,非常好的intros在这里:反应性扩展初学者指南。最后,Somasegar有一篇与您的Rx问题非常相似的博客文章:.NET的反应性扩展 (webservice call of bingtranslate,您所需要的一切;)

票数 1
EN

Stack Overflow用户

发布于 2011-09-10 13:10:48

就用一次定时器。如果使用System.Timers.Timer,则将其AutoReset属性设置为false,并在运行事件处理程序结束时使用Start()重新启动它,通常是在一个finally块中。如果您使用System.Threading.Timer,那么用0来构造它。在回调中调用它的Change()方法来为它充电。

特别是在System.Timers.Timer的情况下,这样做是非常重要的。线程池线程的数量没有上限,它将开始调用经过的事件处理程序。如果机器被加载,它们可能需要一段时间才能真正开始运行。有足够的机会让不止一个人同时开始跑步。而且很难停止计时器。

票数 2
EN

Stack Overflow用户

发布于 2011-09-10 13:10:12

考虑在Task.Wait()命名空间中使用System.Threading.Tasks。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7371785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档