Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:包装同步调用以引入超时_C#_Multithreading - Fatal编程技术网

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
。任务应该表示异步完成的工作单元,对变量的赋值不是该工作的一部分。