Ниже приведен пример кода, представляющий дизайн формы Windows, которую я использую в приложении Windows CE.
У нас возникли нерешенные проблемы в нашем приложении, и я подозреваю, что проблема связана с используемым потокомздесь как фоновый рабочий (поскольку класс BackgroundWorker
недоступен в Windows CE).
Вы можете видеть, что объект блокировки используется для предотвращения нескольких экземпляров MyWorker
.
Isэто правильный способ предотвратить множественные случаи такого "работника"?Будет ли это работать, как ожидалось?Будет ли рабочий-одиночка лучше?
public class MainForm : Form {
private object myLock = new Object();
private bool isWorkerStarted = false;
private Thread worker;
public MainForm() {
}
public void btn_Click() {
lock(myLock) {
if(!isWorkerStarted) {
MyWorker worker = new MyWorker();
worker.StartEvent = new EventHandler(ThreadStart);
worker.EndEvent = new EventHandler(ThreadStop);
workerThread = new Thread(worker.DoWork);
workerThread.Start();
isWorkerStarted = true;
}
}
}
public void ThreadStart(object sender, EventArgs args) {
lock(myLock) {
isWorkerStarted = true;
// Invoke some delegate to interact with the window
}
}
public void ThreadStop(object sender, EventArgs args) {
lock(mylock) {
isWorkerThread = false;
}
this.Invoke(new NewFormDelegate(OpenForm));
}
private void OpenForm() {
AnotherWindowForm awf = new AnotherWindowForm();
awf.Show();
this.Close();
}
//******************
// Worker class
//******************
public class MyWorker() {
public event EventHandler StartEvent;
public void OnStart() {
if(StartEvent != null) {
StartEvent(this, new EventArgs());
}
}
// Edit 2011-07-19
public void OnEnd() {
if(EndEvent != null) {
EndEvent(this, new EventArgs());
}
}
public void DoWork() {
OnStart();
// Do some work.
OnEnd();
}
}
}
Редактировать 2011-07-19 Вот более подробная информация о цели проекта.
У нас есть форма Windows с одной кнопкой на устройстве Windows CE.Когда пользователь нажимает кнопку, необходимо запустить рабочий поток, запрашивающий службу WCF.Во время выполнения потока маленькие песочные часы указывают пользователю, что программа занята.Когда работник закончил (т.е. когда он получил «хороший» ответ), он должен остановиться и открыть другую форму Windows поверх текущей (для этой цели я использую метод Invoke
, чтобы делегировать созданиеновая форма).
Единственное требование состоит в том, чтобы пользователь не мог запускать двух рабочих (например, дважды щелкнув по кнопке).И факты таковы, что иногда мы видим, что два сотрудника отправляют запросы в службу WCF с одного устройства.