ここから本文です

セマフォがタイムアウトしました、というエラーメッセージが出ました。 C#で作っ...

mar********さん

2014/8/1910:01:47

セマフォがタイムアウトしました、というエラーメッセージが出ました。
C#で作ったソフトです。

サーバー上のあるフォルダにファイルが書き込まれたら、
一定のタイミングで別のフォルダに移動またはコピーする処理を行っています。
一時的にサーバーとの接続が切れた時に出たようなのですが、
エラーの意味が全く分かりません。
・エラーの意味はどういう意味なのでしょうか。
なるべくやさしく教えてください・・・
・回避するにはプログラムのどういったところを確認し、修正すればよいでしょうか?

宜しくお願いします。

閲覧数:
42,536
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

abi********さん

2014/8/1914:11:19

[メインスレッドとワーカースレッド]
マルチスレッドプログラミングは、御存知ですか。
各処理部が、並列に実行されると言うものです。
例えば、プリンター出力している間は、アプリケーションソフトは、何も行なえません。
プリンター出力の処理をしている間は、アプリケーション本体は、それが終わるまで、待っている必要があるからです。
そこで、プリンター出力の処理部と、アプリケーション本体の処理部を、並列に実行させます。
すなわち、マルチスレッドプログラミングです。
そうすれば、プリンター出力をしている間でも、アプリケーション本体は、別の操作が行なえます。
なお、アプリケーション本体の処理部をメインスレッドと言います。
プリンター出力の処理部をワーカースレッド、又はサブスレッドと言います。


[セマフォの意味]
例えば、メインスレッドにカウンターを設けたとします(単なる数値を上げていくだけの整数型変数を設ける)。
そして、ワーカースレッドA、ワーカースレッドB、ワーカースレッドC と言う3個のワーカースレッドで、メインスレッドのカウンターをカウントアップ(数値上げ)したとします。
Aが100回、Bも100回、Cも100回カウントアップすれば、カウンターの値は、合計300に成っているはずです。
しかし、実際は、例えば 312 とか、異常な値に成ります(値は、マシン環境などの条件によって異なる)。
これは、
「各スレッドが並列に実行される」
と言うと聞こえがよいですが、平たく言えば、
「各スレッドは、勝手気ままに動作している」
と言うことだからです。
スレッドは、相手のスレッドの動作を気にせず、勝手に動作しているのですから、各スレッド間でデーターを通信し合うと、異常が発生します。
そこで、各スレッド間でデーターをやり取りする場合は、各スレッドを制御する機能を活用します。
すなわち、各スレッドを交通整理するような制御機能です。
このような制御機能のことを、スレッドの「同期」と言います。
スレッドを「同期」させる機能は、何種類かありますが、その内のひとつにセマフォと言う制御機能があります。


[「セマフォがタイムアウトしました」と言うエラー内容の意味]
前述のカウンターの例の場合で説明します。
ワーカースレッドBが、メインスレッドのカウンターをアクセスしようとしているとします。
しかし、既にワーカースレッドAが、カウンターをアクセス中だったとします。
この場合、セマフォは、Bに対して、Aのアクセスが終わるまで待機させます。
ここで、もしもA が故障して、いつまで待ってもアクセス中だったら、どうなるでしょうか。
セマフォは、タイムアウトのエラーを出します。


[サーバーのマルチスレッドと、質問のエラー]
サーバーは、大抵がマルチスレッドプログラミングに成っています。
例えば、クライアントからの受け付け処理を、ワーカースレッドで処理させています。
そして、その受け付け処理用ワーカースレッドが、クライアントからデーターを受信したら、その受信データーをメインスレッドに渡します。
この場合、当然、セマフォか、何らかの制御機能を活用しています。
この時、例えば受信中に、その受信処理部が壊れたら、セマフォは、
「もう、スレッド間の制御をし切れないよ」
とエラーを出します。
それが、質問で言われているエラーの内容です。


[回避の修正の件]
以上の説明から、回避の修正方法は、だいたいわかると思います。
セマフォのエラーと言うと、何か特別なものに感じますが、実際は上記の説明の通り、本当に根本的なものです。
よって、質問で言われている「接続が切れる」と言った根本的なものを直すしかないです。

  • abi********さん

    2014/8/1920:44:51

    [回避修正の回答に対する追記]
    回避の修正方法で、

    > 「接続が切れる」と言った根本的なものを直す

    と述べましたが、サーバーは、受身側なので、エラー処理として再接続は、無理ですよね。
    接続指示をするのは、サーバー側ではなく、クライアント側なので、サーバー側のエラー処理で、再接続するのは無理ですよね。
    それならば、やはり接続が切れる根本原因を何とかしたほうがよいです。
    おそらくファイル処理(ファイルの移動やコピー)を行なっている最中に、接続が切れるのだと思います。
    ファイル処理は、よく知られている通り、比較的時間のかかる処理です。
    そのため、ファイル処理を行なっているスレッド(おそらくメインスレッド)に、通信処理用スレッドが受信データーを渡すときに、タイムアウトしてしまいます。
    よって、ファイル処理は、マルチスレッドプログラミングにする必要があります。
    すなわち、ファイル処理用のワ ---

    (続く)

  • その他の返信(1件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2014/8/21 07:11:59

非常に分かりやすく教えていただきありがとうございました。
マルチスレッドは以前設備でやったことがありますが、かなり苦労して最終的にうまくいかなかったのでそれ以来使ったことがないです・・・また挑戦してみたいと思います。

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる