【问题标题】:UWP with AppService and periodical updating带有 AppService 和定期更新的 UWP
【发布时间】:2018-02-23 23:58:34
【问题描述】:

我是 c# 和 uwp 的新手,目前我正在开发一个简单的应用程序来试用 UWP 中的应用程序服务。

我想做的是创建一个带有 UI 和一些逻辑的 UWP 应用程序,然后连接到一个应用程序服务(Windows 运行时组件),我在其中生成一个数字。然后这个数字会显示在 UI 上。它工作得很好,但我想通过定期更新来扩展这个示例 - 我想定期更改该数字(例如每五秒)。

我正在寻求一些帮助如何做到这一点。我可以使用计时器定期向应用服务发送消息并接收带有新号码的响应。但我其实不喜欢这种做法。

相反,我想直接在应用服务中使用计时器,并定期在主应用中接收响应。有可能吗?

更新

这是 AppService 中的方法,它生成随机数并将响应发送到主应用程序。

    private async void AppServiceConnection_RequestReceivedAsync(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
    {
        var deferral = args.GetDeferral();
        var requestMessage = args.Request.Message;
        var responseMessage = new ValueSet();
        var tasks = new List<Task>();

        foreach (var item in requestMessage)
        {
            if (item.Value.ToString() == "k")
            {
                var task1 = Task.Run(() =>
                {
                    responseMessage.Add(item.Value.ToString(), rand.NextDouble().ToString());
                });
                tasks.Add(task1);
            }

            if (item.Value.ToString() == "k2")
            {
                var task2 = Task.Run(() =>
                {
                        responseMessage.Add(item.Value.ToString(), rand.NextDouble().ToString());
                });
                tasks.Add(task2);
            }
        }

        Task.WaitAll(tasks.ToArray());
        await args.Request.SendResponseAsync(responseMessage);

        deferral.Complete();
    }

这是主应用程序中的方法,它会定期向应用程序服务发送消息。

    private async void timerCallback(object state)
    {
        appServiceConnection = new AppServiceConnection
        {
            AppServiceName = "...",
            PackageFamilyName = "...";
        };

        var status = await appServiceConnection.OpenAsync();
        switch (status)
        {
            default:
                break;
        }

        var message = new ValueSet();
        message.Add("0", "k");
        message.Add("1", "k2");

        var response = await appServiceConnection.SendMessageAsync(message);
        switch (response.Status)
        {
            default:
                break;
        }

        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High,
            () => {
                randomNumbersString = string.Format("Task1: {0} \nTask2: {1}",
                    response.Message.Where((x) => x.Key == "k").First().Value.ToString(),
                    response.Message.Where((x) => x.Key == "k2").First().Value.ToString());
            });

它按预期工作,但是我想将计时器从主应用程序移动到应用程序服务,可以吗?

非常感谢

【问题讨论】:

  • 请分享您到现在为止的尝试。

标签: c# uwp


【解决方案1】:

您可以考虑使用事件。 Window Runtime Component 应该声明类似UpdateGUI 的事件。您应该在主应用程序中订阅该事件。

现在使用task 以适当的参数定期引发事件。

可以帮助你的示例代码为msdn

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 2018-06-06
    • 2018-09-28
    • 1970-01-01
    • 2021-08-28
    • 2015-08-11
    • 2017-02-13
    • 2011-02-12
    • 2019-01-19
    相关资源
    最近更新 更多