繁体   English   中英

无法将异步Lambda表达式转换为委托类型&#39;Func <UIAccessibilityCustomAction, bool>

[英]Cannot convert async lambda expression to delegate type 'Func<UIAccessibilityCustomAction, bool>

出现错误:

错误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;
    }

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

请记住,异步是ContinueWith的(种类)语法糖。 您的语法是完美的,但是如果我将其重写为:

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

可能的解决方案

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

  1. 如果有,请使用接受异步回调的API。
  2. 使您的工作同步。
  3. 等待(阻止)您的工作项:

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

    但是,根据您的情况, 这可能会导致死锁

  4. 让您的工作人员“失火忘却”(异步作废),并在启动工作后立即返回true。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM