2012-09-03 13 views
10

VB6には、コントロールをOSに戻し、その単一スレッド環境でマルチスレッド動作を模倣するために呼び出すDoEvents()メソッドがありました。C#VB 6 DoEventsに相当する

VB 6 DoEvents()に相当する.NETフレームワークは何ですか?

+1

あなたはDoeventsを考えていると思います。 Yieldは、列挙処理で使用される.NETメソッドです。そして.NETの同等のものはApplication.DoEvents()です(使用言語に関係なく) – Zippit

+2

'Application.DoEvents()== DoEvents'? – Marlon

+0

@マールロン:そうです。実際、私はこの質問を数年ごとに尋ねています。私が最後にそれを尋ねたときは思い出せません。あなたは正しいかもしれませんが、それは答えになるかもしれませんが、私の記憶は私を失敗させます。私はまた、System.Diagnostics.Processクラスのメソッドの1つで代用が見つかりましたが、私は確かに覚えていないと考えています。 –

答えて

8

Application.DoEvents()(リサイズの一部)

+0

WPFはどうですか?私はWinFormsが嫌いです –

+3

@ColeJohnson古いApplication.DoEvents()メソッドは、[* Dispatcher *](http://msdn.microsoft.com/en-us/magazine/cc163328.aspx)を使用することを賛成してWPFで廃止されました。または[* Background Worker Thread *](http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/)を参照してください。説明したように処理を行います。両方のオブジェクトを使用する方法については、リンクを参照してください。 –

+0

一般に、私はDoEventsの使用はお勧めしません。 GUIを停止することができます。 Application.DoEventsのGoogleの問題 –

23

あなたがApplication.DoEvents()を使用することができます。なぜ使用しないでくださいThreadingクラスまたは単にBackground Workers? .net環境で作業している場合は、DoEventsを使用しないでください。 VB6の上に置いておきます。

1

コードでApplication.DoEvents()を呼び出すと、アプリケーションは他のイベントを処理できます。たとえば、ListBoxにデータを追加し、コードにDoEventsを追加するフォームがある場合、別のウィンドウがドラッグされたときにフォームが再描画されます。コードからDoEventsを削除すると、ボタンのクリックイベントハンドラが終了するまでフォームは再描画されません。メッセージングの詳細については、「Windowsフォームのユーザー入力」を参照してください。

Visual Basic 6.0とは異なり、DoEventsメソッドはThread.Sleepメソッドを呼び出しません。

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; 
    } 
} 
} 

です。

関連する問題