VB6有一个DoEvents()方法,您可以调用该方法将控制权返回给操作系统并模拟该单线程环境中的多线程行为。
什么是VB框架等效的VB 6 DoEvents()?
答案 0 :(得分:24)
您可以使用Application.DoEvents()
。为什么不使用 Threading 类或只是 Background Workers ?如果您在.net环境中进行操作,请不要使用DoEvents
。把它保留在VB6上。
答案 1 :(得分:8)
Application.DoEvents()(WinForms的一部分)
答案 2 :(得分:5)
以下是一般的DoEvents类型方法
using System;
using System.Windows.Threading;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Permissions;
namespace Utilites
{
/// <summary>
/// Emulates the VB6 DoEvents to refresh a window during long running events
/// </summary>
public class ScreenEvents
{
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}
public static object ExitFrame(object f)
{
((DispatcherFrame)f).Continue = false;
return null;
}
}
}
它不需要知道应用程序。
答案 3 :(得分:1)
如果在代码中调用Application.DoEvents(),则应用程序可以处理其他事件。例如,如果您有一个表单将数据添加到ListBox并将DoEvents添加到您的代码中,那么当另一个窗口被拖动时,您的表单将重新绘制。如果从代码中删除DoEvents,则在按钮的单击事件处理程序执行完毕之前,表单将不会重新绘制。有关消息传递的详细信息,请参阅Windows窗体中的用户输入。
与Visual Basic 6.0不同,DoEvents方法不会调用Thread.Sleep方法。
答案 4 :(得分:0)
您不应使用Application.DoEvents()。它将有重新进入的问题。您应该在循环内调用:
await System.Windows.Threading.Dispatcher.Yield()
它将执行相同的操作。但是,您将需要将其放入异步方法中。这具有将方法标记为异步的额外优势,以供调用方法使用。给调用Await()的await Dispatcher.Yield方法添加后缀是很好的。该方法不是自然异步的(即它确实具有CPU绑定的工作),但出于所有目的和目的,该方法将变为异步,因为它不会锁定调用线程。