【问题标题】:How to use actors of akka.net in MVVM?如何在 MVVM 中使用 akka.net 的演员?
【发布时间】:2018-11-19 21:03:29
【问题描述】:

似乎在控制台应用程序或单元测试中使用 akka.net 非常容易。

但我想尝试一些演员的简单登录方法:打开启动画面,发送登录命令,登录成功后关闭启动画面。现在答案被发送给发送者,它是一个演员。等待 Ask 呼叫的应答会阻塞 UI。 MainViewModel 已经派生自一个基类,因此不能将其设为演员。

public void OnStartupCommand(EventArgs args)
{
    _splashScreen = new SplashScreenView();
    _splashScreen.Show();
    // [1]
    _actorSystem.ActorSelection("/user/system").Tell(new Login("Me"));
    // [2]
    var mainWindowActor =_actorSystem.ActorOf(Props.Create(() => new 
    MainWindowActor(this)), "mainwindow");
    mainWindowActor.Tell(new Login("me"));
    // [3]
    var result = await _actorSystem.ActorSelection("/user/system").Ask(new Login("me")); 
}
  1. 直接打电话给负责的演员,答案是发送给死信。还有更复杂的例子吗?
  2. 会收到答案并可以调用主视图模型的回调,但给我 InvalidOperationException "Call from invalid thread"
  3. 似乎是获取调用结果的唯一途径

我想知道如何通过 Actor 消息填充 ListViews 或 ComboBoxes。

【问题讨论】:

    标签: .net wpf xaml akka.net


    【解决方案1】:

    默认情况下,大多数 akka actor 都安排在后台线程中,因此它们无法在 UI 上进行直接更新(仅允许应用程序的 UI/主线程执行此操作)。如果你想在 UI 线程上生成一个actor,你需要将它配置为使用SynchronizedDispatcher

    【讨论】:

    • 是的,明白了。线程的事情是可以解决的。但是我将如何真正创建一个想要获取列表视图内容的演员? Form/Widget/Whatever 本身会是一个演员来获得答案吗?还是我会使用事件来重定向传入的数据?但是它可能不适合流媒体的东西,不是吗?我在这里寻找一个好的/最佳实践,你知道
    • 这更多是设计问题(不适合 StackOverflow 问题),但一般直觉是保持单一责任原则。如果你想用一个actor来更新UI控件,不要用它来管理业务领域逻辑。
    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多