gpt4 book ai didi

c# - 异步匿名无参数方法作为方法参数

转载 作者:行者123 更新时间:2023-12-03 10:55:03 25 4
gpt4 key购买 nike

我有一个类用作所有ViewModel的父级。它包含一个用于调用其他方法的特定方法,并显示错误时加载消息和消息框(主要是):

public class BaseViewModel
{
async public void Try(Func<Task> action, string errorMessage = null, string waitMessage = null)
{
try
{
if (waitMessage != null)
ShowLoading(waitMessage);
await action();
}
catch (Exception e)
{
ShowError(errorMessage, e);
}
finally
{
HideLoading();
}
}
}

它是异步的,因此我的 ShowLoading可以动画化,诸如此类。
  • 是否正确实现?

  • 它将始终获得匿名(lambda)无参数 Task。我的主要问题是如何实际构造这些 Task。假设我在 Command的子级中有一个 ViewModelBase,执行时会调用以下方法:
    private void OnMyCommandExecute()
    {
    Try(() =>
    {
    Thread.Sleep(5000);
    }, "error", "please wait");
    }

    由于 Not all code paths return a value in lambda expression of type 'System.Func<System.Threading.Tasks.Task>'而无法编译。显而易见,因为我们 awaitFunc。这使我想到第二个问题:
  • 在此示例中,应在Try调用中放入哪些内容才能使其正常工作?

  • 我尝试了一些非常丑陋的事情,并且我真的希望答案是完全不同的,否则将使可读性降低:
    Try(async () =>
    {
    return await Task.Factory.StartNew(() =>
    {
    SharePointService.Connect(Connection);
    IsConnected = true;
    });
    }

    它不会编译,但是到现在为止,这样更好。 return错误: Since 'System.Func<System.Threading.Tasks.Task>' is an异步 method that returns 'Task', a return keyword must not be followed by an object expression. Did you intend to return 'Task<T>'?

    最佳答案

    Try接受返回Task的方法。在第一个示例中,您提供的方法是void

    在第二个示例中,您将提供一种返回Task<Task>的方法,但是尝试在需要Task(非通用)的上下文中使用它。

    如果要使用非异步lambda,则只需让该lambda返回要使用的Task:

    Try(()=>Task.Factory.StartNew(() =>
    {
    SharePointService.Connect(Connection);
    IsConnected = true;
    }));

    如果要使用 async lambda,则需要等待任务而不返回它:
    Try(async () => await Task.Factory.StartNew(() =>
    {
    SharePointService.Connect(Connection);
    IsConnected = true;
    }));

    请注意,这里没有异步lambda的真正目的。这两个片段的性能相同,但是第二个片段在代码膨胀以及整个状态机上增加了一些额外的开销,而运行时实际上并不需要它们。

    关于c# - 异步匿名无参数方法作为方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28238927/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com