2012-01-25 25 views
2

変更したいリストボックスを含むメインフォームクラスがあります。ボックスには、時間のかかる方法で作成されたアイテムが挿入されます。今、それはこのようになります(手で例を発明し、有効なC#ではないかもしれません):別のクラスの別のスレッドからUIを更新する

List<string> strings = StaticClassHelper.GetStrings(inputString); 
foreach(string s in strings) 
{ 
    listBox1.Add(s); 
} 

//meanwhile, in a different class, in a different file... 

public static List<string> GetStrings(inputString) 
{ 
    List<string> result = new List<string>(); 
    foreach(string s in inputString.Split('c')) 
    { 
     result.Add(s.Reverse()); 
     Thread.Sleep(1000); 
    } 
    return result; 
} 

私が代わりにやりたい何が新しい文字列が見つかったとして、定期的にリストボックスを更新しています。スレッドメソッドが同じクラスにあるときに私が見つけた他の答えは、イベントハンドラを設定することができます。私はここで何をしますか?

+0

GetStringsが各文字列をゆっくりと取得し、文字列が見つかるたびにリストボックスをバックグラウンドで更新したいと思っていますか? – Bort

+0

@Bort:はい、そうです。 – bossmann

答えて

0

リストボックスを含むクラスは、文字列を追加するためのメソッドを公開する必要がある - このメソッドが別のスレッドで呼び出されるかもしれないので、スレッドセーフな呼び出しメカニズムを作成する

listBox1.Invoke(...) 

を使用する必要がある

public void AddItemToList(string Item) 
{ 
    if(InvokeRequired) 
     Invoke(new Action<string>(AddItemToList), Item); 
    else 
     listBox1.Add(Item); 
} 

私は確信してアイテムが追加されたSYを作るために、この場合に呼び出す好む:ここ

5

は、私は私はこのようなフォームのメソッドを作成し、これを行うには好きなようですnchronously、そうでなければ彼らは順序が乱れることができます。注文について気にしない場合は、BeginInvokeを使用してください。これは少し速くなります。このメソッドは公開されているので、フォームへの参照を取得できる限り、アプリケーション内のどのクラスからでも使用できます。

もう1つの利点は、UIスレッドまたは非UIスレッドから呼び出すことができ、Invokeが必要かどうかを判断することです。この方法では、呼び出し元は実行中のスレッドを意識する必要はありません。通常、Windowsフォームで、Formへの参照を取得する方法についてのあなたのコメントに対処するために

UPDATE あなたのProgram.csファイルは次のようになりAPP:

static class Program 
{ 
    static void Main() 
    { 
     MyForm form = new MyForm(); 
     Application.Run(form); 
    } 

} 

これは一般的にどのような私です特に「単一のフォーム」アプリケーションの場合は、どうなる:

static class Program 
{ 
    public static MyForm MainWindow; 

    static void Main() 
    { 
     mainWindow = new MyForm(); 
     Application.Run(form); 
    } 

} 

そして、あなたはどこかでかなりそれにアクセスすることができます。

Program.MainWindow.AddToList(...); 
+0

私はこれを取得します。私が得られないことは、静的メソッドでフォームへの参照をどうやって作ることができるかということです。 – bossmann

+0

@bossman更新を見る – CodingGorilla

0

GetStringsを反復子として書き直すことは可能でしょうか?あなたのUIで、GetStringの結果を繰り返し処理するバックグラウンドスレッドを開始し、毎回リストボックスを更新することができます。

public static System.Collections.IEnumerable GetStrings(inputString) 
{ 
    foreach(string s in inputString.Split('c')) 
    { 
     yield return s.Reverse(); 
     Thread.Sleep(1000); 
    } 
} 

とUI(と仮定すると、C#4)中:何かのような

Task.Factory.StartNew(() => 
{ 
    foreach (string s in StaticClassHelper.GetStrings(inputString)) 
    { 
     string toAdd = s; 
     listBox1.Invoke(new Action(() => listBox1.Add(toAdd))); 
    } 
} 

おそらくクリーナーそれについて移動する方法が、これはあなたが探しているもの、あなたを取得する必要があります。

関連する問題