无法将异步lambda表达式转换为委托类型'Func <uiaccessibilitycustomaction,bool =“”>

时间:2018-11-06 19:04:21

标签: c# ios asynchronous xamarin task

获取错误:

错误CS4010:无法将异步lambda表达式转换为委托类型'Func'。异步lambda表达式可能会返回void,Task或Task,这些都不可转换为'Func

UIAccessibilityCustomAction someAccessibilityAction = new
                UIAccessibilityCustomAction(
                SwipeActionMarkTextValue("Accessibility Text", false),
                            async (UIAccessibilityCustomAction arg) =>{

                                 await TestAsyncMethod();
                                return true;
                            });


    private async Task<bool> TestAsyncMethod()
    {
         await Task.Delay(5000);
        return true;
    }

1 个答案:

答案 0 :(得分:0)

您的异步方法不会返回布尔值。它返回一个Task

请记住,异步是ContinueWith的(种类)语法糖。您的语法是完美的,但是如果我将其重写为以下内容,则可以帮助说明我的观点:

(UIAccessibilityCustomAction arg) => TestAsyncMethod().ContinueWith(b => true)

可能的解决方案

我对Xamarin.iOS并不熟悉,它还取决于您要完成的任务,但是下面是一些常规解决方案:

  1. 使用一个可以接受异步回调的API。
  2. 使您的工作保持同步。
  3. 等待(阻止)您的工作项:

    /*NO ASYNC HERE*/ (UIAccessibilityCustomAction arg) =>{
        TestAsyncMethod().GetAwaiter().GetResult();
            return true;
        })
    

    不过取决于您的情况this might cause a deadlock

  4. 使您的工作人员“解雇”(异步作废),并在启动它后立即返回true。

    UIAccessibilityCustomAction someAccessibilityAction = new UIAccessibilityCustomAction(
        SwipeActionMarkTextValue("Accessibility Text", false),
        (UIAccessibilityCustomAction arg) => {
            TestAsyncMethod();
            return true;
        });
    private async void TestAsyncMethod()
    {
        await Task.Delay(5000);
    }