C# 如何在it方法之外中止异步/等待
我有一个方法和一个事件C# 如何在it方法之外中止异步/等待,c#,async-await,C#,Async Await,我有一个方法和一个事件 private void Grid_MouseWheel(object sender, MouseWheelEventArgs e) { if (currentSection == OsuSection.PreLoad) return; if(VolumeMixer.Visibility == Visibility.Collapsed) { isAwaitVolumeG
private void Grid_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (currentSection == OsuSection.PreLoad)
return;
if(VolumeMixer.Visibility == Visibility.Collapsed)
{
isAwaitVolumeGaugeRunning = true;
VolumeMixer.Visibility = Visibility.Visible;
DoubleAnimation fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromSeconds(0.1), FillBehavior.Stop);
fadeIn.Completed += (object senderr, EventArgs ee) => { VolumeMixer.Opacity = 1; };
VolumeMixer.BeginAnimation(OpacityProperty, fadeIn);
Fadeout();
return;
}
if (e.Delta > 0)
workingResources.MasterVolumeValue += 5;
else
workingResources.MasterVolumeValue -= 5;
}
private async Task Fadeout()
{
await Task.Delay(1500);
if (!isAwaitVolumeGaugeRunning)
return;
DoubleAnimation fadeOut = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(0.1), FillBehavior.Stop);
fadeOut.Completed += (object sender, EventArgs e) =>
{
VolumeMixer.Opacity = 0;
VolumeMixer.Visibility = Visibility.Collapsed;
};
VolumeMixer.BeginAnimation(OpacityProperty, fadeOut);
isAwaitVolumeGaugeRunning = false;
}
当用户滚动时,Canvas VolumeMixer FadeIn和MasterVolueValue将绑定到文本块和媒体元素。但如果用户在1.5秒后连续滚动,画布淡出和淡出(耗时0.2秒)。因此,我希望在用户完成滚动1.5秒后隐藏画布,如FCin所述,您可以使用CancellationToken。但是,在这种情况下,我想知道是否最好在按下按钮后立即将消息框灰显?然后在异步操作完成后重新启用该按钮。对我来说,这似乎比处理CancellationToken和重新启动异步进程更干净。如FCin所述,您可以使用CancellationToken。但是,在这种情况下,我想知道是否最好在按下按钮后立即将消息框灰显?然后在异步操作完成后重新启用该按钮。对我来说,处理CancellationTokens并重新启动异步进程似乎更简单。创建一个并将其
Token
属性的值传递给要取消的方法。要中止,请调用CancellationTokenSource对象的Cancel()
方法
private static CancellationTokenSource _cancellationTokenSource;
private void Btn_Click(object sender, EventArgs e)
{
if(previousPress)
{
_cancellationTokenSource.Cancel();
}
_cancellationTokenSource = new CancellationTokenSource();
TaskMethodAsync(_cancellationTokenSource.Token);
}
private async Task TaskMethodAsync(CancellationToken cancellationToken)
{
await Task.Delay(1000, cancellationToken);
MessageBox.Show("Hello World!");
}
创建并将其标记
属性的值传递给要取消的方法。要中止,请调用CancellationTokenSource对象的Cancel()
方法
private static CancellationTokenSource _cancellationTokenSource;
private void Btn_Click(object sender, EventArgs e)
{
if(previousPress)
{
_cancellationTokenSource.Cancel();
}
_cancellationTokenSource = new CancellationTokenSource();
TaskMethodAsync(_cancellationTokenSource.Token);
}
private async Task TaskMethodAsync(CancellationToken cancellationToken)
{
await Task.Delay(1000, cancellationToken);
MessageBox.Show("Hello World!");
}
您可以通过
CancellationToken
并在等待1秒后检查它是否需要中止。您不是在询问如何中止任务。您正在询问如何在另一项任务完成之前防止按钮单击否,我想中止MessageBox.Show()MessageBox.Show()需要在第二秒之后立即显示。如果您单击过快,MessageBox将显示与上一个用户相比不到1秒的时间Click@QuanVN顺便说一句,async void仅适用于事件处理程序。不返回结果的方法应使用async Task SomeMethod()
签名。TaskMethod的签名应该是async Task TaskMethod()
,事件处理程序async void Btn\u单击
。处理程序应该类似于private async void Btn_Click(..{…;wait TaskMethod();}
。如果在处理程序的开头禁用该按钮,并在结尾启用该按钮,则用户将无法在任务完成之前单击该按钮。您可以传递CancellationToken
,等待1秒后检查是否需要中止该按钮。您不是在问如何中止任务。您正在询问如何在另一项任务完成之前防止按钮单击否,我想中止MessageBox.Show()MessageBox.Show()需要在第二秒之后立即显示。如果您单击过快,MessageBox将显示与上一个用户相比不到1秒的时间Click@QuanVN顺便说一句,async void仅适用于事件处理程序。不返回结果的方法应使用async Task SomeMethod()
签名。TaskMethod的签名应该是async Task TaskMethod()
,事件处理程序async void Btn\u单击
。处理程序应该类似于private async void Btn_Click(..{…;wait TaskMethod();}
。如果在处理程序的开头禁用按钮,并在结尾启用它,则在任务完成之前,用户将无法单击该按钮sync void方法是一种不好的做法。在这种情况下,可以使用异步任务。同样按照惯例,异步方法名称应以async word结尾。为了摆脱静态变量,可以设置TaskMethod
。我无法将事件设置为异步,因为我在xamlasync void中声明事件方法是错误的做法。在这种情况下,可以使用异步任务。同样按照惯例,异步方法名称应该以async word结尾。为了摆脱静态变量,可以创建TaskMethod
。我无法使事件异步,因为我在xaml中声明了事件