AvaloniaUI: AppBuilder实例中已经调用过Setup函数

4
每当我尝试从基础应用程序重新启动Avalonia应用程序时,都会出现异常:“在SetupWithLifetime()调用上已经在一个AppBuilder实例上调用了Setup。”。
应用程序启动代码为:
       public static void Start()
        {
            lifeTime = new ClassicDesktopStyleApplicationLifetime()
            {
                ShutdownMode = ShutdownMode.OnLastWindowClose
            };

            BuildAvaloniaApp().SetupWithLifetime(lifeTime);

            lifeTime.Start(new[] { "" });
        }

        public static AppBuilder BuildAvaloniaApp()
            => AppBuilder.Configure<App>()
                .UsePlatformDetect()
                .LogToTrace()
                .UseReactiveUI();

应用程序关闭代码是:

        lifeTime.Shutdown();
        lifeTime.Dispose();

这里有一个链接,指向产生此错误的功能示例代码:https://pastebin.com/J1jqppPv 有没有人遇到过这样的问题?谢谢。

1个回答

1

SetupWithLifetime 调用 Setup,但 Setup 只能被调用一次。一个可能的解决方案是在 BuildAvaloniaApp 上调用 SetupWithoutStarting,这也只能被调用一次,例如:

private static AppBuilder s_builder;

static void Main(string[] args)
{
    s_builder = BuildAvaloniaApp();
}

public static void Start()
{
    lifeTime = new ClassicDesktopStyleApplicationLifetime()
    {
        ShutdownMode = ShutdownMode.OnLastWindowClose
    };

    s_builder.Instance.Lifetime = lifeTime;
    s_builder.Instance.OnFrameworkInitializationCompleted();

    lifeTime.Start(new[] { "" });
}

private static AppBuilder BuildAvaloniaApp()
    => AppBuilder.Configure<App>()
        .UsePlatformDetect()
        .LogToTrace()
        .UseReactiveUI();

补充说明:在 macOS 上重启应用程序可能不起作用。


感谢@José,我需要在单独的线程中启动 Avalonia 应用程序以不阻塞主应用程序线程(因此使用我的示例代码启动线程)。在这种情况下,我在 OnFrameworkInitializationCompleted() 中得到了“来自无效线程的调用”。我的解决方法是不停止生命周期,而只关闭 MainWindow,然后再次显示它。这是我的代码:https://pastebin.com/wMYaZFNp - user15123902
这是 macOS 的另一个问题(不知道它是否是您的目标平台):https://github.com/AvaloniaUI/Avalonia/issues/2800。在不同线程上运行应用程序也不容易(甚至是不可能的),例如 UI 线程是静态的:https://github.com/AvaloniaUI/Avalonia/blob/1a39210febf92e9e87b3ebacca9b56d99e660913/src/Avalonia.Base/Threading/Dispatcher.cs#L21。 - José Pedro
我的目标平台是Linux,因此行为可能类似于MacOS。我使用并发布的解决方案更像是软重启 :) 非常感谢@José - user15123902

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接