C# 如何确保我可以在Android应用程序中使用Azure移动服务而无需计时器?
我正在尝试从我的Xamarin Android应用程序使用Azure移动服务。它起作用了。然而,没有计时器,我无法让它工作。在文档中,我找不到任何关于需要计时器的信息,因此我想知道如何在没有计时器的情况下使用Azure移动服务 这是我的带计时器的代码。它起作用了。我的应用程序没有冻结,我可以在VisualStudio中的调试输出中看到最后一行确实执行了。这是我的密码:C# 如何确保我可以在Android应用程序中使用Azure移动服务而无需计时器?,c#,android,azure,timer,xamarin,C#,Android,Azure,Timer,Xamarin,我正在尝试从我的Xamarin Android应用程序使用Azure移动服务。它起作用了。然而,没有计时器,我无法让它工作。在文档中,我找不到任何关于需要计时器的信息,因此我想知道如何在没有计时器的情况下使用Azure移动服务 这是我的带计时器的代码。它起作用了。我的应用程序没有冻结,我可以在VisualStudio中的调试输出中看到最后一行确实执行了。这是我的密码: protected override void OnCreate(Bundle bundle) {
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
Button button = FindViewById<Button>(Resource.Id.MyButton);
CurrentPlatform.Init();
timer = new System.Timers.Timer(1);
timer.Elapsed += OnTimedEvent;
timer.Start();
//GetDataFromAzure();
}
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
timer.Stop();
GetDataFromAzure();
}
private void GetDataFromAzure()
{
var arguments = new Dictionary<string, string>();
arguments.Add("input", "TestInput");
var resultDoe = MobileService.InvokeApiAsync<string>("NameOfController", System.Net.Http.HttpMethod.Get, arguments);
System.Diagnostics.Debug.WriteLine("Before Wait!!!!!!!!!!!!!");
resultDoe.Wait();
System.Diagnostics.Debug.WriteLine("After Wait!!!!!!!!!!!!!");
var endresult = resultDoe.Result;
System.Diagnostics.Debug.WriteLine("End Of GetDataFromAzure!!!!!!!!!!!!!! " + endresult);
}
由于计时器的原因,代码可能看起来很奇怪,但要知道这段代码确实有效,这一点很重要。在调试输出中,我可以看到:[0:]GetDataFromAzure的结尾!!!!!!!!!!!!!!TestOutPut,它显示返回了预期结果并执行了GetDataFromAzure方法
现在,让我们移除计时器。它应该还能用,但不行。这是我没有定时器的代码:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
Button button = FindViewById<Button>(Resource.Id.MyButton);
CurrentPlatform.Init();
//timer = new System.Timers.Timer(1);
//timer.Elapsed += OnTimedEvent;
//timer.Start();
GetDataFromAzure();
}
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
timer.Stop();
GetDataFromAzure();
}
private void GetDataFromAzure()
{
var arguments = new Dictionary<string, string>();
arguments.Add("input", "TestInput");
var resultDoe = MobileService.InvokeApiAsync<string>("NameOfController", System.Net.Http.HttpMethod.Get, arguments);
System.Diagnostics.Debug.WriteLine("Before Wait!!!!!!!!!!!!!");
resultDoe.Wait();
System.Diagnostics.Debug.WriteLine("After Wait!!!!!!!!!!!!!");
var endresult = resultDoe.Result;
System.Diagnostics.Debug.WriteLine("End Of GetDataFromAzure!!!!!!!!!!!!!! " + endresult);
}
问题变得很清楚。resultDoe.Wait在未使用计时器时冻结应用程序。在输出之前,我可以看到等待!!!!!!!!!!!!!但是我等了以后就看不见了。而且,我的申请被冻结了
我很清楚如何使用Azure移动服务。我让它工作。然而,我不清楚如何在没有定时器的情况下让它工作。如果没有计时器,我就无法编写代码。如何确保我可以在Android应用程序中使用Azure移动服务而无需计时器?绝对不需要添加计时器。问题是InvokeApiAsync是一个返回任务的异步方法,您正在尝试同步使用它 首先,将GetDataFromAzure方法重构为如下内容:
private async Task GetDataFromAzureAsync()
{
var arguments = new Dictionary<string, string>();
arguments.Add("input", "TestInput");
System.Diagnostics.Debug.WriteLine("Before await!!!!!!!!!!!!!");
var resultDoe = await MobileService.InvokeApiAsync<string>("NameOfController", System.Net.Http.HttpMethod.Get, arguments);
System.Diagnostics.Debug.WriteLine("End Of GetDataFromAzure!!!!!!!!!!!!!! " + resultDoe);
}
然后更改它的调用方式,取出所有计时器代码,并将OnCreate更改为:
protected async override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
Button button = FindViewById<Button>(Resource.Id.MyButton);
CurrentPlatform.Init();
await GetDataFromAzureAsync();
}
嗯,实际上这意味着这个问题需要C 5代码。用C4解决这个问题是不可能的。我说得对吗?在C 4和.NET 4.0中使用等待是非常常见的。我的答案需要.NET 4.5,但如果出于某种原因您需要与.NET 4.0的互操作性,则不需要它。抱歉,我在问题中没有看到.NET 4.0的要求。如果4.0,如果你想让它脱离前台线程,你可以使用Task.Run而不是计时器。如果您这样做,当回调发生时,如果您想更新UI上的任何内容,您将需要同步回前台线程。但是,如果您需要使用4.0,我会使用异步目标包来处理仍然锁定到4.0的任何内容。我不清楚重读我的评论,因此,如果您需要与使用.Net 4.0的项目共享代码,Async Targeting Pack允许您在4.5之前的.Net版本中使用Async/Wait。我还可以做些什么来帮助您解决问题?