C# 为外部调用实现超时

C# 为外部调用实现超时,c#,C#,我知道秒表可以用来不断循环,直到经过X个时间: void DoWork() { TimeSpan maxDuration = TimeSpan.FromMinutes(3); Stopwatch sw = Stopwatch.StartNew(); while (sw.Elapsed < maxDuration) { // do some work } } void DoWork() { TimeSpan maxDuration=

我知道秒表可以用来不断循环,直到经过X个时间:

void DoWork()
{
    TimeSpan maxDuration = TimeSpan.FromMinutes(3);
    Stopwatch sw = Stopwatch.StartNew();

    while (sw.Elapsed < maxDuration)
    {
        // do some work
    }
}
void DoWork()
{
TimeSpan maxDuration=TimeSpan.FromMinutes(3);
秒表sw=Stopwatch.StartNew();
同时(经过的软件<最大持续时间)
{
//做些工作
}
}
但是,如果该循环包含一个需要很长时间的操作(例如对外部资源的调用),该循环是否会等到响应返回,然后再次迭代并看到秒表已过

void DoWork()
{
    TimeSpan maxDuration = TimeSpan.FromMinutes(3);
    Stopwatch sw = Stopwatch.StartNew();

    while (sw.Elapsed < maxDuration)
    {
        var response = CallExternalResourceWhichTakes5Minutes()
    }
}
void DoWork()
{
TimeSpan maxDuration=TimeSpan.FromMinutes(3);
秒表sw=Stopwatch.StartNew();
同时(经过的软件<最大持续时间)
{
var response=CallerExternalResource,调用时间为5分钟()
}
}
在响应返回之前,我们不会再次检查while循环的条件,对吗?如果是这样的话,如果在返回响应之前计时器已过,那么中止外部调用的合适解决方案是什么?

在响应返回之前,我们不会再次检查while循环的条件,这是否正确?

这一点很明显,因为您正在使用对方法的同步调用

如果在返回响应之前计时器超时,那么中止外部调用的合适解决方案是什么

实现这一点的适当方法之一是使用

您可以在这里设置超时,5分钟后的结果将被忽略

 Task.Wait(myTask,new TimeSpan(0,5,0)); 

我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。@FBryant,您的问题相当广泛,至少有两个方向可以给出答案(线程和异步调用)。您能否提供有关您的环境和这些定时呼叫的上下文的更多详细信息?(你的问题也与此相关,答案可能对你有用。)谢谢你的知识库,请你详细说明一下时间流逝后会发生什么。外部调用是否继续处理,但调用线程忽略了这一点并继续执行?它将简单地定义一个内部超时,该超时将阻止父任务的执行,如果超时已达到,则如果任务在分配的时间内完成执行,则返回true;否则,错误。这意味着,如果执行了外部方法的调用,代码可以在5分钟前继续执行
 Task.Wait(myTask,new TimeSpan(0,5,0));