Skip to content

Instantly share code, notes, and snippets.

@nishio-dens
Created October 4, 2012 16:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nishio-dens/3834679 to your computer and use it in GitHub Desktop.
Save nishio-dens/3834679 to your computer and use it in GitHub Desktop.
// 指定したタスクが2秒以内に終わらなかったらTimeoutを発生させる。リトライは3回したい。
// 期待する動作: タスクA実行 -> 2秒経過Timeout -> すぐにタスクA実行 -> Timeout -> タスクA実行 -> Timeout -> Exception投げて終了
// 実際の動作: タスクA実行 -> 2秒経過Timeout -> 前の処理が終わるまで待ってるので8秒の待ち時間 -> タスクA実行 -> 以下略
// Create無いでObservable.Startとかして非同期処理走らせる?
// でもそうするとタスクAが二重で走ることになってしまい困る。スレッドAbortしたいけどできない。さてどうしよう
// 実際はタスクAが3時間とか10時間とかそんな感じなんで、前の処理が終わるまで待ってるのはつらい。。。
var source = Observable
.Create<int>(o =>
{
// ここが実行したいタスクA
// このタスクはインクリメンタルなものに分割できない
Console.WriteLine("Call Long-running Task");
Thread.Sleep(TimeSpan.FromSeconds(10));
Console.WriteLine("Complete Long-running Task");
o.OnNext(1); // dummy
o.OnCompleted();
return () => { };
})
.Timeout(TimeSpan.FromSeconds(2))
.Catch((TimeoutException e) => { Console.WriteLine("catch timeout {0}", e.ToString()); return Observable.Throw<int>(e); })
.Retry(3)
.Wait();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment