C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: C# Windowsサービス、スレッド、デストラクタについて


(過去ログ 48 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■26129 / inTopicNo.1)  C# Windowsサービス、スレッド、デストラクタについて
  
□投稿者/ 直江兼続 (1回)-(2008/10/02(Thu) 14:19:58)

分類:[C#] 

お世話になります。

C#のWindowsサービスにて不明な点があるため、
投稿させて頂きました。

サービスをスタートさせるタイミングで5つのスレッドを起動させます。
スレッド内では常に監視の処理を行っている状態のまま、
サービスで停止を行う際、スレッド内に設けてあるデストラクタを起動させ、
かつスレッド自体のインスタンスも破棄したいのですが、
何かうまいやり方はありますでしょうか?

サービス側のOnStop()メソッド内の記述をお願い致します。



using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using Client;
namespace Service
{
public partial class Service1 : ServiceBase
{
private Thread thread_; // スレッド
private Thread[] threads; // スレッド配列

public Service1()
{
InitializeComponent();

// スレッド配列(5スレッド)作成
threads = new Thread[5];
}

protected override void OnStart(string[] args)
{
string aaa = "あああ";
string bbb = "いいい";

for (int i = 0; i < 4; i++)
{
// スレッド作成
Client1 aClient_ = new Client1(aaa, bbb);
thread_ = new Thread(new ThreadStart(aClient_.ThreadMethod));

// スレッド開始
thread_.Start();

threads[i] = thread_;
}
}

protected override void OnStop()
{
///******************************
///???????????????
///******************************
}
}
}



using System;
using System.Collections.Generic;
using System.Text;
namespace Client
{
public class Client1
{
private string aaa;
private string bbb;

public Client1(string a, string b)
{
this.aaa = a;
this.bbb = b;
}

~Client1()
{
///---------------------------
///終了処理
///---------------------------
}

public void ThreadMethod()
{
bool isContinue = true; // ループフラグ

// trueの間ループ
while (isContinue)
{
///---------------------------
///監視処理
///---------------------------
}
}
}
}

引用返信 編集キー/
■26130 / inTopicNo.2)  Re[1]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ aetos(旧シャノン) (13回)-(2008/10/02(Thu) 14:28:42)
No26129 (直江兼続 さん) に返信
> サービスをスタートさせるタイミングで5つのスレッドを起動させます。
> スレッド内では常に監視の処理を行っている状態のまま、
> サービスで停止を行う際、スレッド内に設けてあるデストラクタを起動させ、
> かつスレッド自体のインスタンスも破棄したいのですが、
> 何かうまいやり方はありますでしょうか?

スレッドを停止させるのなら、Client1 クラスの外部から isContinue を false にしてやればいいでしょう。
そのためには、isContinue は Client1 のメンバ変数にして、Service1 側で Client1 の配列を持っておく必要があるでしょう。

デストラクタは無理です。というか、C# にデストラクタというものはありません。
~Client1 はファイナライザというもので、インスタンスがガベージコレクションによって回収されるときに呼ばれるものです。そのタイミングは制御できません。
クラスに対して何か後始末を行う必要があるのなら、IDisposable インターフェイスを実装して、その Dispose を呼んでやりましょう。
この辺は注意点とか書き始めると長〜くなるので割愛します。IDisposable で検索して調べてみてください。
引用返信 編集キー/
■26131 / inTopicNo.3)  Re[2]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ 直江兼続 (2回)-(2008/10/02(Thu) 14:43:41)
No26130 (aetos(旧シャノン) さん) に返信

早速のご回答ありがとうございます。

> スレッドを停止させるのなら、Client1 クラスの外部から isContinue を false にしてやればいいでしょう。
> そのためには、isContinue は Client1 のメンバ変数にして、Service1 側で Client1 の配列を持っておく必要があるでしょう。

すみません、説明が欠けていました・・。
監視処理のwhile文の中に1行、DBにデータが入ってくるまで監視するコードがあります。
その行でずっと滞在しているため、外部からfalseにしたところではスレッド自体、処理が停止には至らないかと思います・・。

> デストラクタは無理です。というか、C# にデストラクタというものはありません。
> ~Client1 はファイナライザというもので、インスタンスがガベージコレクションによって回収されるときに呼ばれるものです。そのタイミングは制御できません。
> クラスに対して何か後始末を行う必要があるのなら、IDisposable インターフェイスを実装して、その Dispose を呼んでやりましょう。
> この辺は注意点とか書き始めると長〜くなるので割愛します。IDisposable で検索して調べてみてください。

ありがとうございます。調べてみます。
引用返信 編集キー/
■26132 / inTopicNo.4)  Re[3]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ aetos(旧シャノン) (14回)-(2008/10/02(Thu) 14:46:18)
No26131 (直江兼続 さん) に返信
> 監視処理のwhile文の中に1行、DBにデータが入ってくるまで監視するコードがあります。
> その行でずっと滞在しているため、外部からfalseにしたところではスレッド自体、処理が停止には至らないかと思います・・。

それをどのように待機しているのかわからなければ、中断する方法もわかりませんね。
どういうコードで待っているんでしょうか?
引用返信 編集キー/
■26134 / inTopicNo.5)  Re[4]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ 直江兼続 (3回)-(2008/10/02(Thu) 14:59:24)
No26132 (aetos(旧シャノン) さん) に返信
> それをどのように待機しているのかわからなければ、中断する方法もわかりませんね。
> どういうコードで待っているんでしょうか?

詳しく言いますと、DBではなくIBM社のMQサーバにメッセージが到達するのを常に監視しています。
while文の中身は下記のような感じになります。

MQGetMessageOptions mqOptions; // MQオプション
MQMessage mqMessage; // MQメッセージ
MQQueue mqQueue; // ローカルキュー

// MQメッセージ初期化
mqMessage = new MQMessage();

// 無制限待機
mqGetMsgOpts.WaitInterval = MQC.MQWI_UNLIMITED;

// ↓の一行で監視
mqQueue.Get(mqMessage, mqOptions);

引用返信 編集キー/
■26142 / inTopicNo.6)  Re[5]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ なちゃ (175回)-(2008/10/02(Thu) 16:29:40)
その大気メソッドに、例えばWaitHandleを渡せるものとかはないですか?
もしなければ、タイムアウトを指定して適当な間隔でチェックしないといけないかな?

引用返信 編集キー/
■26165 / inTopicNo.7)  Re[2]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ NyaRuRu (64回)-(2008/10/02(Thu) 19:29:16)
No26130 (aetos(旧シャノン) さん) に返信
> デストラクタは無理です。というか、C# にデストラクタというものはありません。
> ~Client1 はファイナライザというもので、インスタンスがガベージコレクションによって回収されるときに呼ばれるものです。そのタイミングは制御できません。

このあたりの用語には変遷があって、少なくとも C# 3.0 仕様に "destructors" という用語は存在します (§10.13)
ファイナライザは CLI の用語です。
引用返信 編集キー/
■26169 / inTopicNo.8)  Re[3]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ よねKEN (13回)-(2008/10/02(Thu) 22:50:37)
> このあたりの用語には変遷があって、少なくとも C# 3.0 仕様に "destructors" という用語は存在します (§10.13)

C#1.0から普通にありますね。
引用返信 編集キー/
■26172 / inTopicNo.9)  Re[4]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ NyaRuRu (65回)-(2008/10/03(Fri) 00:26:03)
No26169 (よねKEN さん) に返信
>>このあたりの用語には変遷があって、少なくとも C# 3.0 仕様に "destructors" という用語は存在します (§10.13)
>
> C#1.0から普通にありますね。

はい。
C# 1.0 では destructors と呼ばれていましたが、C# 2.0 仕様で一旦 finalizer に名前が変わっています。
このときの経緯は、『プログラミングMicrosoft .NET Framework 第2版』§20.4 の囲み記事にも書かれています。

以下のページから ISO/IEC 23270:2006 をダウンロードできるのですが、§17.12 Finalizers には次のように書かれています。
http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
17.12 Finalizers
[Note: In the previous version of this standard, what is now referred to as a "finalizer" was called a "destructor". Experience has shown that the term "destructor" caused confusion and often resulted to incorrect expectations, especially to programmers knowing C++. In C++, a destructor is called in a determinate manner, whereas, in C#, a finalizer is not. To get determinate behavior from C#, one should use Dispose. end note]

が、Visual Studio 2008 に付属する統合版の C# 3.0 spec. ではやはり destructors のままになっていて、これが単なる直し忘れなのか、それともまた名前を元に戻すつもりなのかは不明です。
引用返信 編集キー/
■26205 / inTopicNo.10)  Re[5]: C# Windowsサービス、スレッド、デストラクタについて
□投稿者/ 直江兼続 (4回)-(2008/10/03(Fri) 17:42:38)
皆様

ご回答、誠にありがとうございました。

私の質問の仕方が悪かったのが一番の原因のため、
結局のところ解決はできませんでしたが、
現在、threadの違う問題で頭を抱えています…

新たに投稿する予定でいますが、
その際は、今回のようにご親切に回答の方頂けると
幸いに思います。

非常に良い掲示板であると確信しました。
また宜しくお願い致します。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -