2011-12-29 2 views
3

Я очень новичок в WPF. И только начал изучать потоки.правильный метод нарезания резьбы

Это мой сценарий: Я создал программу с кнопкой START. Когда нажимается кнопка «Пуск», она начинает выполнять сложную задачу в разных потоках. Перед началом сложной задачи он также создает элементы пользовательского интерфейса в еще один поток STA (технически я не знаю, что я говорю).

Вот пример кода:

// button click event 
private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    System.Threading.Thread myThread = new System.Threading.Thread(
     () => buttonUpdate("Hello ")); 
    myThread.Start(); 
} 

private void buttonUpdate(string text) 
{ 
    System.Threading.Thread myThread = new System.Threading.Thread(createUI); 
    myThread.SetApartmentState(System.Threading.ApartmentState.STA); 

    // set the current thread to background so that it's existant will totally 
    // depend upon existance of main thread. 
    myThread.IsBackground = true; 
    myThread.Start(); 

    // Please don't read this loop it's just for my entertainment! 
    for (int i = 0; i < 1000; i++) 
    { 
     System.Threading.Thread.Sleep(100); 
     button1.updateControl(new Action(
      () => button1.Content = text + i.ToString())); 
     if (i == 100) 
      break; 
    } 

    // close main window after the value of "i" reaches 100; 
    this.updateControl(new Action(()=>this.Close())); 
} 

// method to create UI in STA thread. This thread will be set to run 
// as background thread. 


private void createUI() 
{ 
    // Create Grids and other UI component here 
} 

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

EDIT: OOps Я забыл упомянуть этот класс:

public static class ControlException 
{ 
    public static void updateControl(this Control control, Action code) 
    { 
     if (!control.Dispatcher.CheckAccess()) 
      control.Dispatcher.BeginInvoke(code); 
     else 
      code.Invoke(); 
    } 
} 
+0

Может помочь, если вы действительно понимаете, что вы говорите. Повторите некоторые исследования, когда вы поймете, что означает поток STA. –

ответ

2

Если вы используете .NET 4.0 вы можете рассмотреть вопрос об использовании Task класса от Task parallel library. Прочтите это, поскольку вы говорите, что вы новичок в потоковом режиме. Он гораздо более гибкий в использовании.

Кроме того, я думаю, что эта связь может быть очень полезным для вас:

http://www.albahari.com/threading/

+0

Я не смог работать с элементами пользовательского интерфейса, используя Task. см. это: http://stackoverflow.com/questions/8665158/a-very-basic-explanation-for-threading-in-wpf – user995387

+1

@ user995387 - Вы можете использовать метод TaskScheduler.FromCurrentSynchronizationContext для получения TaskScheduler для текущей синхронизации контекст. Отправляй сообщение: http://stackoverflow.com/questions/5971686/how-to-create-a-task-tpl-running-a-sta-thread – TheBoyan

+0

Спасибо, что это была отличная помощь. Я попробую так. – user995387

2

Там, кажется, нет никаких оснований использовать 2 нити.

Вы должны иметь возможность выполнить createUI() на основной теме. Это будет достаточно сложно, когда настанет время заполнить эти элементы управления.

+0

Большое спасибо за ваше предложение. На самом деле я действительно пренебрегал этим. : P – user995387

+0

, кстати, будет хорошо, если я использую tat createUI() для создания flowdocument? Я хочу распечатать его, который также будет работать в фоновом режиме – user995387

1

Только один поток может взаимодействовать с пользовательским интерфейсом. Если вы собираетесь добавить элемент управления на страницу или окна, вы должны использовать поток, который создал страницу или окно. Типичным сценарием является использование потоков для создания дорогих данных или объекта в фоновом режиме, а затем в обратном вызове (выполняется в основном потоке) извлекает результат и связывает соответствующие данные с пользовательским интерфейсом. Посмотрите на использование BackgroundWorker, поскольку он заботится о большом количестве деталей для потоковой передачи. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx Почему вы хотите создать объекты пользовательского интерфейса на другом аэде?

+1

Чтобы добавить его в документ потока и распечатать его ... – user995387

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