2011-02-07 6 views
2

Я пытаюсь выполнить итерацию выбранных значений в ListBox, чтобы узнать, есть ли у меня совпадение, и затем установить bool, если я это сделаю. У меня есть этот код, который работает, когда не резьб:Многопоточный доступ к элементам управления winform 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) Вы можете вызывать вызовы для управления потоком пользовательского интерфейса. Конечно, вы можете передать массив объектов в качестве параметра. Но очень просто поставить какой-то параметр в неправильное место. Я думаю, лучше использовать анонимного делегата. То же самое для возврата значений из-под контроля. Вам просто нужно указать тип возвращаемого значения в подписи делегата.

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) Вы можете предоставить параметры при запуске потока.

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

Таким образом, вам не нужно будет доступ к управлению от рабочего потока:

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) Вы можете использовать АОП, например, 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}); 
Смежные вопросы