我想创建一个状态栏。应该从类中的任何方法设置状态。如果状态已设置,则应显示5000毫秒。在5000ms之后,状态应为空。有时会发生这种情况,我想在旧状态仍处于活动状态时设置状态。对于这种情况,应该覆盖旧状态并等待Task.Delay(5000);应重置并从0开始计数。
我目前的代码如下:
public CancellationTokenSource tokenSource { get; set; }
public CancellationToken token { get; set; }
public async Task SetStatusMessage(string pStatusMessage)
{
tokenSource.Cancel();
await Task.Run(async () =>
{
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
this.Dispatcher.Invoke(() =>
{
this.txtStatusMessage.Text = pStatusMessage;
});
await Task.Delay(5000, token);
this.Dispatcher.Invoke(() =>
{
this.txtStatusMessage.Text = "";
});
}, token);
public async void AnyMethod()
{
await this.SetStatusMessage("Hello World");
}
这不起作用,因为我在运行之前取消了该任务。这就是我获得OperationCanceledException
(?)的原因。
答案 0 :(得分:1)
这就是我要做的。我不知道您在使用async
时使用public async Task SetStatusMessage(string pStatusMessage)
{
CancellationTokenSource localToken;
try
{
if (tokenSource != null)
tokenSource.Cancel();
tokenSource = new CancellationTokenSource();
localToken = this.tokenSource;
this.txtStatusMessage.Text = pStatusMessage;
await Task.Delay(5000, localToken.token);
this.txtStatusMessage.Text = "";
}
catch (TaskCanceledException) {}
finally
{
localToken.Dispose();
}
}
的原因。
function cmp ($a, $b) {
list($num1, $den1) = explode("/", $a);
list($num2, $den2) = explode("/", $b);
$a = ($num1/$den1);
$b = ($num2/$den2);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$classroom = array("4/10","4/2","4/1","4/11","5/2","1/2","5/1","5/10","5/12");
usort($classroom, "cmp");
print_R($classroom);