Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确保我可以在Android应用程序中使用Azure移动服务而无需计时器?_C#_Android_Azure_Timer_Xamarin - Fatal编程技术网

C# 如何确保我可以在Android应用程序中使用Azure移动服务而无需计时器?

C# 如何确保我可以在Android应用程序中使用Azure移动服务而无需计时器?,c#,android,azure,timer,xamarin,C#,Android,Azure,Timer,Xamarin,我正在尝试从我的Xamarin Android应用程序使用Azure移动服务。它起作用了。然而,没有计时器,我无法让它工作。在文档中,我找不到任何关于需要计时器的信息,因此我想知道如何在没有计时器的情况下使用Azure移动服务 这是我的带计时器的代码。它起作用了。我的应用程序没有冻结,我可以在VisualStudio中的调试输出中看到最后一行确实执行了。这是我的密码: protected override void OnCreate(Bundle bundle) {

我正在尝试从我的Xamarin Android应用程序使用Azure移动服务。它起作用了。然而,没有计时器,我无法让它工作。在文档中,我找不到任何关于需要计时器的信息,因此我想知道如何在没有计时器的情况下使用Azure移动服务

这是我的带计时器的代码。它起作用了。我的应用程序没有冻结,我可以在VisualStudio中的调试输出中看到最后一行确实执行了。这是我的密码:

        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。我还可以做些什么来帮助您解决问题?