Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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#_.net_Delay - Fatal编程技术网

C# 延迟任务,如果超过延迟时间,则返回空值

C# 延迟任务,如果超过延迟时间,则返回空值,c#,.net,delay,C#,.net,Delay,如何延迟任务直到返回变量值,如果超过延迟时间,变量值将返回null。例如: TaskA.Delay(5000); if variable not equal to empty string continue with Task A else if delay time not exceeded yet continue running the current task else set variable's value to empty string 诀窍是启动一个“延迟”任务,并与您

如何延迟任务直到返回变量值,如果超过延迟时间,变量值将返回null。例如:

TaskA.Delay(5000);

if variable not equal to empty string
continue with Task A

else
if delay time not exceeded yet

continue running the current task
else

set variable's value to empty string
诀窍是启动一个“延迟”任务,并与您的“真实”任务同时运行,看看哪个任务先完成:

public async Task<int?> ValueOrNull( )
{
  var task = SomeAsyncMethod() //--> the work to wait on
  var timeout = Task.Delay( new TimeSpan( 0,0,5 ) );
  var first = await Task.WhenAny( task, timeout );
  if ( first == timeout ) return null;
  await first;  //--> It's already done, but let it throw any exception here
  return;
}
public异步任务值ornull()
{
var task=SomeAsyncMethod()//-->要等待的工作
var timeout=Task.Delay(新的时间跨度(0,0,5));
var first=等待任务.WhenAny(任务,超时);
if(first==timeout)返回null;
首先等待;//-->它已经完成,但是让它在这里抛出任何异常
返回;
}
您可以通过将任务和超时传递到:

public async Task<T> ValueOrNull( Task<T> task, TimeSpan patience )
{
  var timeout = Task.Delay( patience );
  var first = await Task.WhenAny( task, timeout );
  if ( first == timeout ) return default( T );
  await first;  //--> It's already done, but let it throw any exception here
  return;
}
public异步任务值ornull(任务任务,时间跨度)
{
var超时=任务延迟(耐心);
var first=等待任务.WhenAny(任务,超时);
if(first==超时)返回默认值(T);
首先等待;//-->它已经完成,但是让它在这里抛出任何异常
返回;
}

有一种更干净的方法来实现Clay的方法

public Task<int?> ValueOrNull( )
{
    return Task.WhenAny(
        SomeAsyncMethod(),
        DelayResult(default(int?), TimeSpan.FromSeconds(5))
    );
}

public async Task<T> DelayResult<T>(T result, TimeSpan delay)
{
    await Task.Delay(delay);
    return result;
}
public任务值ornull()
{
return Task.whenay(
SomeAsyncMethod(),
DelayResult(默认值(整数?),TimeSpan.FromSeconds(5))
);
}
公共异步任务延迟结果(T结果,TimeSpan延迟)
{
等待任务。延迟(延迟);
返回结果;
}

请提供更多信息。这个变量是什么?谁改变了它的价值?您想延迟的任务在哪里?或者在单独的线程上运行它,如果超过时间就终止它,或者您可以在获取变量的位置经常检查时间。这完全取决于你需要这个做什么。@Claudius Threading?你为什么要为这么简单的事情提出一个全新的思路。如果任务不能在单独的线程上运行该怎么办?如果您需要使用非阻塞I/O并发执行数千个这样的操作,该怎么办(提示:一个线程使用约1MB的Ram,1000个线程将使用超过1GB的Ram)。