VB6には、制御をOSに戻し、そのシングルスレッド環境でのマルチスレッド動作を模倣するために呼び出すDoEvents()メソッドがありました。
VB 6 DoEvents()に相当する.NETフレームワークとは何ですか?
を使用できますApplication.DoEvents()
。スレッドクラスまたは単にバックグラウンドワーカーを使用してみませんか?.net環境で実行している場合は、を使用しないでくださいDoEvents
。VB6のままにしておきます。
Application.DoEvents()(WinFormsの一部)
以下は、一般的な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;
}
}
}
アプリケーションについて知る必要はありません。
コードでApplication.DoEvents()を呼び出すと、アプリケーションは他のイベントを処理できます。たとえば、リストボックスにデータを追加し、コードにDoEventsを追加するフォームがある場合、別のウィンドウをその上にドラッグすると、フォームが再描画されます。コードからDoEventsを削除すると、ボタンのクリックイベントハンドラーの実行が終了するまで、フォームは再描画されません。メッセージングの詳細については、「Windowsフォームでのユーザー入力」を参照してください。
Visual Basic 6.0とは異なり、DoEventsメソッドはThread.Sleepメソッドを呼び出しません。
Application.DoEvents()は使用しないでください。再入可能性の問題が発生します。ループ内で呼び出す必要があります。
await System.Windows.Threading.Dispatcher.Yield()
同じことをします。ただし、非同期メソッドに入れる必要があります。これには、メソッドを呼び出すためにメソッドを非同期としてマークするという追加の利点があります。await Dispatcher.YieldをAsync()で呼び出すメソッドに接尾辞を付けると便利です。このメソッドは自然に非同期ではありません(つまり、CPUにバインドされた作業があります)が、すべての目的と目的で、呼び出し元のスレッドをロックしないため、メソッドは非同期になります。