首页 > 解决方案 > 如何通过 IsActiveChanged 运行异步任务

问题描述

我有一个我试图通过 OnIsActiveChanged 运行的任务,以便它在我作为视图打开时运行。我确定我正在做一些显而易见的事情,但我对异步代码相对较新。OnIsActiveChanged告诉我时出错了

Task SettingsView.OnIsActiveChanged(object?, EventArgs)有错误的返回类型。

这是我尝试使用的方法:

    public async Task OnIsActiveChanged(object? sender, EventArgs e)
    {
        if (IsActive)
        {
            var streaming = _client.BiStreaming();
            var requestStream = streaming.RequestStream;
            var responseStream = streaming.ResponseStream;
    
            //Print
            Debug.WriteLine($"Duration: {Duration.TotalSeconds} seconds");
            Debug.WriteLine("");
    
            await BidirectionalStreamingExample(_client);
        }
    }

这是我试图调用该方法的地方:

    public SettingsView(SequenceEditorService.SequenceEditorServiceClient client)
    {
        InitializeComponent();  
        _client = client;
        IsActiveChanged += OnIsActiveChanged;
    }

IsActiveChanged是一个事件处理程序,用于检查视图的状态是否发生变化。我使用的正常方法很好,但是一旦我尝试异步它就坏了。

标签: c#.netasync-await

解决方案


您的问题有两种可能的解决方案,因为我们需要知道IsActiveChanged-event 具有哪种返回类型。void根据 BCL 指南,通常事件应该没有返回类型 ( ),但这种可能性仍然存在。

可能的解决方案:

  • 您必须返回一个Task(如上所述非常不可能)
  • OnIsActiveChanged的返回类型设置为void(可能是解决方案,因为IsActiveChanged可能是 Microsoft 编码的事件,因此符合 BCL 指南)

将第二种解决方案应用于您的代码时,OnIsActiveChanged的签名应如下所示:

public async void OnIsActiveChanged(object sender, EventArgs e)

推荐阅读