C# 延迟任务,如果超过延迟时间,则返回空值
如何延迟任务直到返回变量值,如果超过延迟时间,变量值将返回null。例如: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 诀窍是启动一个“延迟”任务,并与您
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)。