以下は、Windows CEアプリケーションで使用するWindowsフォームのデザインを示すコードサンプルです。.NETのスレッディングについて
私たちのアプリケーションにはいくつかの未解決の問題があります。この問題はバックグラウンドワーカーとしてここで使用されているスレッドから発生していると思われます(Windows CEではクラスBackgroundWorker
が利用できません)。
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 CEデバイスにはボタンが1つのみのWindowsフォームがあります。ユーザーがボタンをクリックすると、WCFサービスを要求するワーカースレッドを開始する必要があります。スレッドの実行中、小さな砂時計は、プログラムがビジーであることをユーザーに示します。作業者が完了したとき(つまり、「良い」回答を受け取ったとき)は、現在のウィンドウの上にある別のWindowsフォームを停止して開く必要があります(そのために、メソッドInvoke
を使用して、形)。
唯一の要件は、は、ボタンを2回クリックするなどして2人の作業者を実行できないようにすることです。実際には、2人のワーカーが同じデバイスからWCFサービスへのリクエストを行っていることが時々分かります。
あなたが持っているものを問題としていません。また、C#プログラミング言語にはスレッド固有の構成要素がありません。あなたは実際にC#のスレッドではなく.NETのスレッドについて質問しています。 –
アプリケーション全体が私たちの問題の原因となる可能性のあるWCFを使用しているため、問題はコードサンプルでは説明が少し難しいです。この投稿の目的は、コードのこの部分が「安全」であることを確認することです。そしてタイトルを変更しました。 – Goulutor
私はあなたが解決しようとしている問題を教えてくれていないということです。 –