Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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# 如何在it方法之外中止异步/等待_C#_Async Await - Fatal编程技术网

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中声明了事件