C#Async void事件处理程序出现警告/错误

时间:2017-10-18 01:27:08

标签: c# async-await

enter image description here

我理解async不应该使用void作为返回类型,除非它是一个事件处理程序。但是我上面有代码片段,当我在项目设置中将警告设置为错误时,我在编译代码时遇到了上述错误。

  

RECS0165异步方法''不应该返回无效

如果我删除async,那么我会收到另一个编译错误

  

等待'运算符只能在异步lambda中使用   表达。考虑使用' async'标记这个lambda表达式。   改性剂。

建议的修复方法是将async添加到匿名函数中。这是一个死锁。

我在这里做错了吗?

重现问题的步骤:

  • 在VS2017中创建一个空白的UWP项目,它将创建app,xaml和MainPage.Xaml。
  • 在MainPage.Xaml.cs中添加以下代码

    命名空间App4 {     使用系统;     使用System.Threading.Tasks;     使用Windows.ApplicationModel.Core;     使用Windows.UI.Core;     使用Windows.UI.Xaml;     使用Windows.UI.Xaml.Controls;

    public sealed partial class MainPage : Page
    {
        private DispatcherTimer refreshTimer;
    
        public MainPage()
        {
            this.InitializeComponent();
    
            this.refreshTimer = new DispatcherTimer()
            {
                Interval = new TimeSpan(0, 0, 30)
            };
    
            refreshTimer.Tick += async (sender, e) => { await DisplayMostRecentLocationData(string.Empty); };
        }
    
        private async Task DisplayMostRecentLocationData(string s)
        {
            await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
    
            });
        }
    }
    

    }

2 个答案:

答案 0 :(得分:3)

Tick事件处理程序委托不正确。

使用

async (sender, e) => ...

或为EventArg

使用e派生类
async (object sender, EventArgs e) => ...    

您目前拥有的是您尝试指定为事件处理程序的匿名对象。编译器不允许这样做错误。

答案 1 :(得分:1)