2009-08-05 3 views
2

Прямо сейчас у меня есть приложение Windows (C#), которое выплевывает длинные отчеты. Каждый отчет захватывает некоторую информацию из пользовательского интерфейса, чтобы ограничить отчеты. Конечно, создание отчета происходит в фоновом потоке, и мне нужно правильно вызвать различные элементы управления, чтобы получить такие вещи, как выбранные индексы и значения. Но я не думаю, что мой код выглядит хорошо и надеялся, что будет лучшая модель. Потому что есть очень много запросов к элементам управления, я сделал общие делегат для каждого типа, которые будут возвращены:Чисто вызывать шаблоны?

private delegate string StringDelegate(); 
private delegate int IntDelegate(); 

Далее вниз, существует различные конкретизации этих делегатов:

private StringDelegate GetYearSelectedItem = new StringDelegate(cmbYearAsync); 

YearAsync выглядит следующим образом :

private string cmbYearAsync() { 
    return cmbYear.SelectedItem.ToString(); 
} 

И, наконец, в коде, который на фоне потока, это то, как я получаю значения:

cmbYear.Invoke(GetCmbYearSelectedItem); 

Есть ли более чистый способ получить эти значения из отдельного потока?

ответ

2

Предполагая, что вы хотите пойти с резьбовым дизайном (возможно, вы хотите, чтобы потоки фона сообщали о частичных результатах пользовательского интерфейса при их запуске?), Если у вас есть C# 3, вы можете немного его немного подправить. Некоторые люди находят метод расширения, как это полезно:

public static class ControlExtensions 
{ 
    public static T Invoke<T>(this Control ctrl, Func<T> func) 
    { 
     if (ctrl.InvokeRequired) 
      return (T) ctrl.Invoke(func); 

     return func(); 
    } 
} 

Как проверить, нужно ли вызов быть ранжированы, он также делает типизированного параметра делегата. Таким образом, вы можете написать:

string selected = comboBox1.Invoke(() => comboBox1.SelectedItem.ToString()); 

Не нужно предварительно объявлять все это. Просто напишите обычный код, который вы напишете, но внутри этого лямбда-шаблона.

Вы можете написать аналогичный метод расширения, который принимает Action вместо Func<T> и возвращает void, для операций, которые не нуждаются в возвращаемом значении.

4

короткий ответ

Не делай этого ;-)

длинный ответ

собрать параметры отчета из пользовательского интерфейса управления фронт (возможно, в небольшом классе) и передать их на отчеты в фоновом режиме нить

Это устраняет поперечный поток вызывает к элементам управления пользовательского интерфейса, и разъединяют параметры отчета из пользовательского интерфейса

Смежные вопросы