none
求助,线程通信问题 RRS feed

  • 问题

  • BOb和各位大哥好

    小弟最近碰到个问题,关于

    SynchronizationContext.Post

    方法的问题。

    问题情景是这样的:有一回调函数

     

    private void FetchMediaContentEventHander(object sender, EventArgs e)

    该函数的作用就是作为接收网络传递过来的媒体内容回调,在该回调中调用

    //sc is a SynchronizationContext form ui thread.
    sc.Post(state =>     
                    {
                        DoSomethingUpdateUI();
                    }, null);

    进行更新UI处理。 当FetchMediaContentEventHander回调次数过于频繁时,会出现异常

    A first chance exception of type 'System.Exception' occurred in System.Runtime.WindowsRuntime.dll
    
    WinRT information: Invoke request processing error.
    
    Additional information: Not enough quota is available to process this command.
    
    If there is a handler for this exception, the program may be safely continued.

    我曾经怀疑是内存占用过多的问题,于是用了以下代码测试:

    //sc is a SynchronizationContext form ui thread.

    for (int k = 0; k < 1000000; k++) { sc.Post(state => { lmg.Add(new BitmapImage(new Uri(@"ms-appx:///Resource/Images/default_thumb.png"))); }, null); } for (int k = 0; k < 1000000; k++) { lmg.Add(new BitmapImage(new Uri(@"ms-appx:///Resource/Images/default_thumb.png"))); }

    第一个FOR循环在大概3万多次的时候会丢出刚才那个异常,程序CRASH。第二个则不会丢出异常以及CRASH。

    打开任务管理器查看内存,发现第一个FOR循环CRASH时大概内存占用200M左右,第二个FOR内存占用到600M,也没出现CRASH现象。 所以应该可以排除是内存占用过多问题。

    所以我猜测应该是POST的问题 。 哪位大哥帮小弟解答下疑惑,到底是什么原因导致这个异常,以及应对方法? 

     




    2012年9月20日 6:26

答案

  • 没有更多的配额来执行命令,这个操作用光了Windows 消息系统对于异步消息队列分配的所有配额,所以抛了这个异常,由于过度频繁调用Post,队列的进入赶不上UI处理消息的速度,导致队列溢出。

    RunAsync 异步调用肯定是有限制的,不过只要不如此过量调用,一般处理速度不会用光所有配额。很遗憾,我也没有找到相关公开的文档来具体说明这个配额量或者限制是多少,不过可以肯定的是,适量使用不会造成问题,你可以在异步调用时候适量让其线程Delay一会,不要过快Post


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月21日 7:03
    版主

全部回复

  • 我在使用CoreDispatcher.RunAsync 函数的时候也碰到错误“Not enough quota is available to process this command”。 怀疑是RunAsync 有次数限制。 查看帮助文档没有说要释放的东东。比较迷惑。

    2012年9月20日 6:42
  • 没有更多的配额来执行命令,这个操作用光了Windows 消息系统对于异步消息队列分配的所有配额,所以抛了这个异常,由于过度频繁调用Post,队列的进入赶不上UI处理消息的速度,导致队列溢出。

    RunAsync 异步调用肯定是有限制的,不过只要不如此过量调用,一般处理速度不会用光所有配额。很遗憾,我也没有找到相关公开的文档来具体说明这个配额量或者限制是多少,不过可以肯定的是,适量使用不会造成问题,你可以在异步调用时候适量让其线程Delay一会,不要过快Post


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月21日 7:03
    版主