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

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

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

Re[5]: c# タイムアウトに関して


(過去ログ 22 を表示中)

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

■9308 / inTopicNo.1)  c# タイムアウトに関して
  
□投稿者/ mk (1回)-(2007/10/24(Wed) 15:09:15)

分類:[C#] 


分類:[C#] 

はじめまして、mkと申します。
C#で他のDLLの処理をコールする処理を作成しているのですが、
そのとき指定した秒数以内に処理が終了しなければタイムアウトとしたいのですが、
どのようにすればよいのでしょうか?
色々と調べてみたのですが、(TransactionScopeとかTimer周り)
使えるようなものは見当たりませんでした。


DotNetのバージョンは1.0です。

引用返信 編集キー/
■9311 / inTopicNo.2)  Re[1]: c# タイムアウトに関して
□投稿者/ επιστημη (616回)-(2007/10/24(Wed) 15:49:03)
επιστημη さんの Web サイト
> C#で他のDLLの処理をコールする処理を作成しているのですが、
> そのとき指定した秒数以内に処理が終了しなければタイムアウトとしたいのですが、

1 スレッドを起こし、その中でDLLの処理を呼ぶ。
2 1と同時に数秒間のタイマ起動。
3 1 が先に終了したら2で起動したタイマを停止。
 2 が先にタイムアウトしたら諦める。
 (その後1が終了するが、その結果は無視する)

ざっくりこんな段取りでいかがかと。

引用返信 編集キー/
■9313 / inTopicNo.3)  Re[2]: c# タイムアウトに関して
□投稿者/ 囚人 (207回)-(2007/10/24(Wed) 16:06:36)
επιστημηさんの方法の他にも非同期デリゲートを使えばお手軽です。
非同期デリゲートは必ずしも「即実行」されるわけではないのですが、一度に実行できる数が多いので現実的には「即実行」されると考えて良いでしょう。
引用返信 編集キー/
■9354 / inTopicNo.4)  Re[3]: c# タイムアウトに関して
□投稿者/ mk (2回)-(2007/10/25(Thu) 08:55:22)
回答いただきありがとうございます。タイマを使う方法でやってみました。
下記の方法でタイムアウトは検出できるのですが、呼び出し側がずうっと帰って
こなかった場合、そのまま固まってしまいます。
タイムアウトした場合は、次の処理に遷移できないのでしょうか?

/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main(string[] args)
{
TimerThread tt = new TimerThread(100000);
try
{
         DLLのメソッド呼び出し。
Console.WriteLine("テスト");
}
finally
{
tt.Terminate();
}
return;
}

public class TimerThread
{

private DateTime timeoutTime;
private uint currentThreadId;
private bool terminateFlag;
private Thread thread;

/// <summary>
/// コンストラクタです。
/// </summary>
/// <param name="timeoutMillisec">タイムアウト値(ミリ秒)。</param>
public TimerThread(int timeoutMillisec)
{
this.timeoutTime = DateTime.Now.AddMilliseconds(timeoutMillisec);
this.currentThreadId = (UInt32)AppDomain.GetCurrentThreadId();
this.terminateFlag = false;
this.thread = new Thread(new ThreadStart(this.ThreadProc));
this.thread.Start();
}

/// <summary>
/// スレッド関数です。
/// </summary>
private void ThreadProc()
{
while (!this.terminateFlag)
{
Thread.Sleep(100);
if (DateTime.Now > this.timeoutTime)
{
// タイムアウトが発生
Console.WriteLine("timuout");
return;
}
}
}

/// <summary>
/// タイムアウト監視用スレッドを終了させます。
/// </summary>
public void Terminate()
{
this.terminateFlag = true;
this.thread.Join();
}
}




引用返信 編集キー/
■9372 / inTopicNo.5)  Re[4]: c# タイムアウトに関して
□投稿者/ Tom Yama (10回)-(2007/10/25(Thu) 12:18:25)
No9354 (mk さん) に返信
> 回答いただきありがとうございます。タイマを使う方法でやってみました。
> 下記の方法でタイムアウトは検出できるのですが、呼び出し側がずうっと帰って
> こなかった場合、そのまま固まってしまいます。
Main()からは、returnしているのに、プロセスが終了しない。ということでしょうか?
であれば、正常な動作かと、思います。プロセスは全てのスレッドが終了しないと、終わりませんから。

# 具体的に何をしたいのかは、存じませんが、
DLL側に手を入れて、タイムアウトされたときに、自身の処理を中断できる仕組みを入れた方がよいと思いますよ。

引用返信 編集キー/
■9398 / inTopicNo.6)  Re[5]: c# タイムアウトに関して
□投稿者/ mk (3回)-(2007/10/25(Thu) 16:59:00)
mkです。
すみません。根本的に間違えていました。
囚人さんの言われた非同期デリゲートで実現できました。
ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -