2011-02-07 5 views
2

ListBoxで選択した値を繰り返し処理して一致があるかどうかを確認しています。winフォームコントロールのマルチスレッドアクセスc#

for (int i = 0; i < FileTypesExcludedListBox.SelectedItems.Count; i++) 
    if (currentFiles[currentFileLoc].EndsWith(FileTypesExcludedListBox.SelectedItems[i].ToString())) 
     doNotCompare = true; 

私はこのコントロールが作成されていないスレッド内で起こっているようにアプリケーションを変更しました。私は前にテキストラベルを更新するために匿名の代理人を使用しましたが、私はこれの返り値が必要ですし、それを行う方法がわかりません...

+0

ありがとう、Proteanですが、私は戻り値をブール値にする必要があり、それが私が苦労しているところです。 – lappy

答えて

1

1)UIスレッドを制御する呼び出しを呼び出すことができます。もちろん、オブジェクトの配列をパラメータとして渡すことができます。しかし、パラメータを間違った場所に置くのは本当に簡単です。私は、代わりに匿名の代理人を使う方が良いと思います。 コントロールから値を返す場合と同じことです。代理署名で返される値の型を指定するだけで済みます。

public string ExcludedFileType 
{ 
    get 
    { 
     if (InvokeRequired) 
      return (string)Invoke((Func<string>)delegate { return ExcludedFileType; }); 

     return (string)listBox1.SelectedItem; 
    } 

    set 
    { 
     if (InvokeRequired) 
     { 
      Invoke((MethodInvoker)delegate { ExcludedFileType = value; }); 
      return; 
     } 

     listBox1.SelectedItem = value; 
    } 
} 

ワーカースレッドから使​​用法:

ExcludedFileType = "jpg"; 
MessageBox.Show(ExcludedFileType); 

2)スレッドを起動するときには、パラメータを提供することができます。

private void DoSomething(object state) 
{ 
    IList<string> excluedeFileTypes = (IList<string>)state; 

    foreach(string fileType in excluedeFileTypes)     
     if (currentFiles[currentFileLoc].EndsWith(fileType)) 
      doNotCompare = true; 
} 

private IList<string> ExcludedFileTypes 
{ 
    get 
    { 
     List<string> filteTypes = new List<string>(); 
     foreach (var item in listBox1.SelectedItems) 
      filteTypes.Add(item.ToString()); 
     return filteTypes; 
    } 
} 

3)あなたは、例えばAOPを使用することができます。

// start async operation  
ThreadPool.QueueUserWorkItem(DoSomething, ExcludedFileTypes); 

だから、あなたは、ワーカースレッドからのコントロールにアクセスする必要がありません。 PostSharpは自動的にスレッドディスパッチを実装します。

1

ウィンドウコントロールはスレッドからのみ、 。

2

フォームの呼び出しメソッド(this.Invoke)を使用して、スレッドから代理人を実行します。

private delegate void YourDelegate(obj param1,obj param2); 

private void YourFunction(obj param1,obj param2) 
{ 
//Write Code Here 
} 

//Call this from your Thread 
this.Invoke(new YourDelegate(YourFunction), new object[] { param1,param2}); 
関連する問題