在后台线程中调用Web服务并在主线程上更新UI

时间:2013-11-22 16:35:04

标签: c# web-services xamarin.ios threadpool

我有一个简单的登录屏幕,用于验证用户并使用Restful Web服务获取数据。 Web服务工作正常,我称之为获取数据,解析并存储在本地数据库中。问题是 - 我想在屏幕上添加一个活动指示器。我可以添加活动指示但问题,它永远不会出现在视图上,因为控件会调用Web服务并获取数据。

如何在后台处理时添加活动指示器?

我也尝试过InvokeOnMainThread

        MonoTouch.UIKit.UIApplication.SharedApplication.InvokeOnMainThread(delegate{ 

            StartActivityIndicator();
            authenticateBtn.Enabled = false;
            authenticateBtn.BackgroundColor = UIColor.Gray;

        });
        // VALIDATE 
        bool isValid = ValidateTextbox ();

        if (isValid == true) {
            CreateUserAccount ();
        }

CreateUserAccount()方法调用Web服务并解析数据。如果我评论行CreateUserAccount()代码工作正常,我可以看到活动指标。 但是当我添加CreateUserAccount()方法时,活动指示符永远不会出现。

如何调用Web服务并执行UI活动。

3 个答案:

答案 0 :(得分:1)

与时俱进,使用C#5 async/await

public async void DoSomething ()
{
    StartActivityIndicator();
    authenticateBtn.Enabled = false;
    authenticateBtn.BackgroundColor = UIColor.Gray;
    bool isValid = ValidateTextbox ();

    if (isValid)
        await CreateUserAccount ();

    StopActivityIndicator (); 
}

答案 1 :(得分:0)

您可以通过在任务中分离Web服务调用来解决此问题。这将在一个单独的线程上执行服务调用,当它完成时,您可以调用InvokeOnMainThread()来完成UI的活动。

这样的东西会起作用,放在你的UIViewController中。

Task CallWebService()
{
    return Task.Factory.StartNew(() => {
         // make your service call. 
    });
}

现在,你可以在你的ViewDidLoad中调用它:

// Inside ViewDidLoad method of your UIViewController
//
// Show your activity indicator first.
StartActivityIndicator();
CallWebService().ContinueWith(task => {

    if(task.isFaulted)
        throw new AggregateException(task.Exception.InnerException.Message);

    // Runs when the task is finished
    InvokeOnMainThread(() => {
        // Hide your activity indicator here. 
        StopActivityIndicator();
    });

});

答案 2 :(得分:0)

您可以在后台工作人员中拨打创建用户帐户

 var worker = new BackgroundWorker();
 worker.DoWork += (s, ev) => ConnectToPanel();
 worker.RunWorkerAsync();