C#:包装同步调用以引入超时

C#: wrap syncronous call to introduce timeout

我有一个同步调用:

var answer = obj.SyncCall(question);

它可能会无限期执行,但我想限制它的执行时间:

// throws TimeoutException if not complete in 1000ms
var answer = obj.SyncCall(question, 1000);

如何将 sync 调用包装到线程中以允许描述的行为?

.NET 4.5: 您可以 运行 一个任务并在您定义的时间内等待它:

Task.Run(() => { answer = obj.SyncCall(question) }).Wait(1000);

.NET 4.5 之前: 您可以使用相同的方法,只使用 ThreadPool 和同步对象:

ManualResetEvent evt = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((object o) =>
{
  answer = obj.SyncCall(question);
  evt.Set();
});
evt.WaitOne(1000);