关于C# WPF中的DoEvents,要稳定且快速的,哪位有比较完美的解法?
RT:使用C#时,相信各位童鞋在WinFrom中没少用Application.DoEvents(如同VB6的DoEvents)。但到了WPF中,这个东西就莫名其妙的被MS忽略了。
在长时间循环处理中,进程阻塞实在难免,网上也有不少DoEvents的解法,效果可以达到,但不是不稳定就是影响速度。下面这一串程序可能比较普及,可惜它不是很稳定,有时会导致窗体停止响应。
后来俺找了个老外写的东西,也能达到类似效果,不过好像有点拖速度——俺的程序需要实时同步单片机的数据,时间很宝贵。
就是这个——
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new System.Threading.ThreadStart(delegate { }));
在长时间循环处理中,进程阻塞实在难免,网上也有不少DoEvents的解法,效果可以达到,但不是不稳定就是影响速度。下面这一串程序可能比较普及,可惜它不是很稳定,有时会导致窗体停止响应。
private static DispatcherOperationCallback exitFrameCallback = new DispatcherOperationCallback(ExitFrame);
/// <summary>
/// Processes all UI messages currently in the message queue.
/// </summary>
public static void DoEvents()
{
DispatcherFrame nestedFrame = new DispatcherFrame();
DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, exitFrameCallback, nestedFrame);
Dispatcher.PushFrame(nestedFrame);
if (exitOperation.Status != DispatcherOperationStatus.Completed)
{
exitOperation.Abort();
}
}
private static Object ExitFrame(Object state)
{
DispatcherFrame frame = state as DispatcherFrame;
// Exit the nested message loop.
frame.Continue = false;
return null;
}后来俺找了个老外写的东西,也能达到类似效果,不过好像有点拖速度——俺的程序需要实时同步单片机的数据,时间很宝贵。
就是这个——
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new System.Threading.ThreadStart(delegate { }));
...全文

