下面是一個代碼示例,演示了我在Windows CE應用程序中使用的Windows窗體的設計。關於.NET中的線程
我們在應用程序中遇到了一些未解決的問題,我懷疑問題來自此處用作後臺工作者的線程(因爲BackgroundWorker
類在Windows CE中不可用)。
您可以看到鎖對象用於防止多個實例MyWorker
。
這是防止這種「工人」的多個實例的正確方法?它會按預期工作嗎?單身職員會更好嗎?
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服務發送請求。
你還沒說你有什麼問題。另外,C#編程語言沒有特定於線程的構造。你實際上在問.NET線程,而不是C#線程。 –
由於整個應用程序使用WCF,可能成爲我們問題的根源,所以只用一個代碼示例來解釋問題有點難。這篇文章的目標是確保代碼的這部分是「安全的」。我改變了標題。 – Goulutor
我的意思是你沒有告訴我們你想要解決什麼問題。 –