この問題にはさまざまな解決策があります (メイン スレッドをフリーズしないこと)。私の解決策は、1 つのタスクを作成し、その中で待機する 2 つ目のタスクを作成することです。ラッパー タスクは待機または結合によってブロックされないため、メイン スレッドはブロックされません。イベントを使用して、ワーカータスクがタイムアウトしたかどうかを発信者に通知できます。コードは次のようになります。
// create asynchronous task. in order not to block the calling thread,
// create and start another task in this one and wait for its completion
var synchronize = new System.Threading.Tasks.Task(() =>
{
var worker = new System.Threading.Tasks.TaskFactory().StartNew(() =>
{
// do something work intensive
});
var workCompleted = worker.Wait(10000 /* timeout */);
if (!workCompleted)
{
// worker task has timed-out
}
});