带AppService和定期更新的UWP

问题描述:

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

我想要做的是创建一个UI和一些逻辑背后的UWP应用程序,然后连接到一个应用程序服务(Windows运行时组件),在那里我生成一个数字。这个号码然后显示在用户界面上。它工作得很好,但我想扩展这个定期更新的例子 - 我想定期更改该数字(例如每隔五秒)。

我在寻求一些帮助如何做到这一点。我可以使用定时器定期将消息发送到应用服务,并用新号码接收响应。但我实际上不喜欢这种方法。

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

UPDATE

这是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()); 
      }); 

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

非常感谢你

+0

请分享你尝试过什么直到现在。 – MKR

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

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

的示例代码,它可以帮助你提供为msdn