Работа с потоками и синхронизация с формой в C#

Июнь 16th, 2011 § 0 comments

В общем-то тема очень не нова и набившая оскомину многим форумам, при всем при этом много неясностей. Попробуем в этом быстренько разобраться. Начнем как положено с лирики. Для использование многопоточности в C# нам нужно будет подключить System.Threading; Для создания потока нужно создать экземпляр класса Thread, который в конструкторе принимает экземпляр объекта ThreadStart, тот в свою очередь принимает, метод который нужно распоточить, замечу что сам метод должен возвращать void. Две подробные статьи о потоках можно найти здесь и здесь


public void SomeMethod()

{

...

}

Thread thread = new Thread (new ThreadStart(this.SomeMethod));

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


public class Launcher
 {
 public string data;
 public void Run()
 {
 ThreadMethod(this.data);
 }
 }

...

Launcher launcher = new Launcher();
 launcher.data = "Наши данные";
 Thread thread = new Thread(new ThreadStart(launcher.Run));
 thread.Start();

Вот таким не хитрым способом мы решили проблему передачи данных потоку. Разберем еще одну проблему с которой очень многие сталкиваются, а именно как изменять состояния контролов формы из потока, если вы попробуете это сделать из потока то не медленно получить ошибку. Вот тут очень хороший пример. Что бы обновить данные из потока нужно, создать метод в классе формы, который мы бкдем использовать для обновления контролов формы, создать делегат такого же типа что и метод, обновления, создать делегат и связать его с методом для обновления формы. Пример лучше многих слов.


public class SomeThreadClass

{

public delegate void Updater(string text);

public static Updater ThreadUpdater;

}

//Где-то до запусков в потоке мы связываем делегат потока с нашей функцией

//объявленной в классе формы, в данном случае это UpdateControl

...

SomeCThreadClass.ThreadUpdater=this.UpdateControl;

...

public void UpdateControl(string text)
 {
 if (this.InvokeRequired == false)
 {
 textbox1.Text=text;
 }
 else
 {
 Updater update = new Update(this.UpdateControl);
 this.Invoke(update, new object[] { text });
 }

 }

Я надеюсь, что я понятно объяснил, возможно спецы скажут что можно сделать по другому либо когда я поднакоплю опыта, выложу другой способ. Спасибо за внимание оставайтесь со мной еще )))

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн