我正在研究一个数据绑定很大的Win.Forms应用程序,我发现了一些奇怪的行为.该应用程序具有单独的I/O线程,通过异步Web请求接收更新,然后将其发送到主/ GUI线程以处理和更新应用程序范围的数据存储(这些数据存储又可能与各种GUI元素绑定数据)等).Web请求另一端的服务器需要定期请求或会话超时.
我已经经历了几个处理线程问题等的尝试解决方案,并且我观察到以下行为:
如果我使用Control.Invoke将更新从I/O线程发送到主线程,并且此更新导致显示MessageBox,则主窗体的消息泵将停止,直到用户单击ok按钮.这也会阻止I/O线程继续最终导致服务器超时.
如果我使用Control.BeginInvoke从I/O线程(或多个)发送更新主线程的主窗体的消息泵并没有停止,但如果一个更新的处理导致了一个消息被显示,其余的处理在用户单击"确定"之前,该更新将暂停.由于I/O线程继续运行并且消息泵继续处理消息,因此可以在具有消息框的那个之前调用几个BeginInvoke用于更新.这导致无序更新,这是不可接受的.
I/O线程向阻塞队列添加更新(非常类似于在.NET中创建阻塞队列<T>).GUI线程使用Forms.Timer定期应用阻塞队列中的所有更新.此解决方案解决了阻塞I/O线程和更新顺序的问题,即下一次更新将永远不会开始,直到上一次完成.但是,性能成本较低,并且在显示更新方面存在延迟,从长远来看这是不可接受的.我希望主线程中的更新处理是事件驱动而不是轮询.
所以对我的问题.我应该怎么做到:
更新:见下面的解决方案
在我的单元测试中使用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'.有谁知道这是否可能?
在最近的一个项目中,我使用了大量的数据绑定和xml序列化.我正在使用C#/ VS2008并已下载.NET框架的符号信息以帮助我进行调试.
我正在处理的应用程序有一个全局"catch all"异常处理程序,如果碰巧有任何未捕获的异常被抛出,则向用户呈现更多可呈现的消息.我的问题是当我打开Exceptions-> Thrown时能够在它们被"catch all"捕获之前调试异常.在我看来,框架抛出了许多未立即捕获的异常(例如在ReflectPropertyDescriptor中),因此我实际上尝试调试的异常会在噪声中丢失.有没有办法摆脱框架引起的异常,但保留我自己的代码?
更新:经过更多研究并实际尝试摆脱框架抛出的异常(许多结果是框架中的已知问题,例如:XmlSerializer在构造函数中给出FileNotFoundException)我终于找到了一个适合我的解决方案,这是在工具>>选项>>调试>>常规>>中打开"只是我的代码"在VS2008中启用我的代码.
.net ×2
begininvoke ×1
c# ×1
delegates ×1
exception ×1
invoke ×1
messagebox ×1
moq ×1
parameters ×1
verify ×1