14

VB6 有一个 DoEvents() 方法,您可以调用该方法将控制权返回给操作系统并在该单线程环境中模拟多线程行为。

与 VB 6 DoEvents() 等效的 .NET 框架是什么?

4

5 回答 5

24

你可以使用Application.DoEvents(). 为什么不使用Threading类或简单地使用Background Workers?如果您在 .net 环境中进行操作,请不要使用DoEvents. 将其保留在 VB6 上。

于 2012-09-03T02:00:49.653 回答
10

Application.DoEvents()(WinForms 的一部分)

于 2012-09-03T01:59:15.510 回答
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;
    }
}
}

它不需要了解应用程序。

于 2012-09-27T17:58:50.643 回答
1

如果您在代码中调用 Application.DoEvents(),您的应用程序可以处理其他事件。例如,如果您有一个将数据添加到 ListBox 并将 DoEvents 添加到您的代码的表单,则当另一个窗口被拖到它上面时,您的表单会重新绘制。如果从代码中删除 DoEvents,则在按钮的单击事件处理程序完成执行之前,您的表单不会重新绘制。有关消息传递的更多信息,请参阅 Windows 窗体中的用户输入。

与 Visual Basic 6.0 不同,DoEvents 方法不调用 Thread.Sleep 方法。

于 2012-09-27T17:47:26.377 回答
0

您不应该使用 Application.DoEvents()。它将有重入问题。您应该在循环内调用:

await System.Windows.Threading.Dispatcher.Yield()

它会做同样的事情。不过,您需要将其放入异步方法中。这具有将方法标记为异步调用方法的额外优势。使用 Async() 为调用 await Dispatcher.Yield 的方法添加后缀是很好的。该方法自然不是异步的(即它确实具有 CPU 绑定工作),但出于所有意图和目的,该方法变为异步,因为它不会锁定调用线程。

于 2018-09-18T06:45:30.710 回答