小编Han*_*ken的帖子

与从非GUI线程显示MessageBox相关的问题

我正在研究一个数据绑定很大的Win.Forms应用程序,我发现了一些奇怪的行为.该应用程序具有单独的I/O线程,通过异步Web请求接收更新,然后将其发送到主/ GUI线程以处理和更新应用程序范围的数据存储(这些数据存储又可能与各种GUI元素绑定数据)等).Web请求另一端的服务器需要定期请求或会话超时.

我已经经历了几个处理线程问题等的尝试解决方案,并且我观察到以下行为:

  1. 如果我使用Control.Invoke将更新从I/O线程发送到主线程,并且此更新导致显示MessageBox,则主窗体的消息泵将停止,直到用户单击ok按钮.这也会阻止I/O线程继续最终导致服务器超时.

  2. 如果我使用Control.BeginInvoke从I/O线程(或多个)发送更新主线程的主窗体的消息泵并没有停止,但如果一个更新的处理导致了一个消息被显示,其余的处理在用户单击"确定"之前,该更新将暂停.由于I/O线程继续运行并且消息泵继续处理消息,因此可以在具有消息框的那个之前调用几个BeginInvoke用于更新.这导致无序更新,这是不可接受的.

  3. I/O线程向阻塞队列添加更新(非常类似于在.NET中创建阻塞队列<T>).GUI线程使用Forms.Timer定期应用阻塞队列中的所有更新.此解决方案解决了阻塞I/O线程和更新顺序的问题,即下一次更新将永远不会开始,直到上一次完成.但是,性能成本较低,并且在显示更新方面存在延迟,从长远来看这是不可接受的.我希望主线程中的更新处理是事件驱动而不是轮询.

所以对我的问题.我应该怎么做到:

  1. 避免阻塞I/O线程
  2. 保证更新按顺序完成
  3. 保持主消息泵运行,同时显示更新后的消息框.

更新:见下面的解决方案

.net multithreading messagebox invoke begininvoke

4
推荐指数
1
解决办法
2688
查看次数

使用Moq中的Delegate参数验证方法

在我的单元测试中使用Moq生成Stubs和Mocks,我有一个案例,我想验证是否调用了一个接受Delegate参数的方法.我不关心提供的特定Delegate参数我只想确保该方法实际上被调用.该方法如下所示:

public interface IInvokerProxy{
    void Invoke(Delegate method);
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我想做这样的事情:

invokerProxyMock.Verify( proxy => proxy.Invoke( It.IsAny<Delegate>));
Run Code Online (Sandbox Code Playgroud)

目前它给我一个错误参数'1':无法从'方法组'转换为'System.Delegate'.有谁知道这是否可能?

parameters delegates moq verify

4
推荐指数
1
解决办法
2422
查看次数

如何摆脱.NET Framework抛出的异常

在最近的一个项目中,我使用了大量的数据绑定和xml序列化.我正在使用C#/ VS2008并已下载.NET框架的符号信息以帮助我进行调试.

我正在处理的应用程序有一个全局"catch all"异常处理程序,如果碰巧有任何未捕获的异常被抛出,则向用户呈现更多可呈现的消息.我的问题是当我打开Exceptions-> Thrown时能够在它们被"catch all"捕获之前调试异常.在我看来,框架抛出了许多未立即捕获的异常(例如在ReflectPropertyDescriptor中),因此我实际上尝试调试的异常会在噪声中丢失.有没有办法摆脱框架引起的异常,但保留我自己的代码?

更新:经过更多研究并实际尝试摆脱框架抛出的异常(许多结果是框架中的已知问题,例如:XmlSerializer在构造函数中给出FileNotFoundException)我终于找到了一个适合我的解决方案,这是在工具>>选项>>调试>>常规>>中打开"只是我的代码"在VS2008中启用我的代码.

.net c# exception debug-symbols

2
推荐指数
1
解决办法
635
查看次数