C#:包装同步调用以引入超时
我有一个同步电话:C#:包装同步调用以引入超时,c#,multithreading,C#,Multithreading,我有一个同步电话: var answer = obj.SyncCall(question); 它可能会无限期地执行,但我想限制它的执行时间: // throws TimeoutException if not complete in 1000ms var answer = obj.SyncCall(question, 1000); 如何将同步调用包装到线程中以允许所描述的行为?.NET 4.5: 您可以运行任务并在定义的时间内等待它: Task.Run(() => { answer =
var answer = obj.SyncCall(question);
它可能会无限期地执行,但我想限制它的执行时间:
// throws TimeoutException if not complete in 1000ms
var answer = obj.SyncCall(question, 1000);
如何将同步调用包装到线程中以允许所描述的行为?.NET 4.5:
您可以运行任务并在定义的时间内等待它:
Task.Run(() => { answer = obj.SyncCall(question) }).Wait(1000);
.NET 4.5之前版本:
您可以使用相同的方法,只需使用线程池和同步对象:
ManualResetEvent evt = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((object o) =>
{
answer = obj.SyncCall(question);
evt.Set();
});
evt.WaitOne(1000);
不幸的是,这个答案可能会帮助您绑定到.NET 4.0。从闭包外部读取答案是否需要任何预防措施?运行线程后不会发生任何事情,因此您不必担心闭包。在退出sync对象的等待操作后,您将在应答变量中分配您的值(您只需在父范围中定义此变量),尽管这似乎是正确的,但我倾向于不编写其操作是变异变量的任务。原始代码没有说明
answer
是什么类型,但可以说它是string
。我倾向于不做任务
,而是做任务
,等待任务完成或超时,然后如果任务正常完成,将任务结果分配给变量answer
。任务应该表示异步完成的工作单元,对变量的赋值不是该工作的一部分。