Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.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
Mono Android:在onPause()状态下终止线程_Android_Multithreading_Thread Safety_Xamarin.android - Fatal编程技术网

Mono Android:在onPause()状态下终止线程

Mono Android:在onPause()状态下终止线程,android,multithreading,thread-safety,xamarin.android,Android,Multithreading,Thread Safety,Xamarin.android,我遇到了一个奇怪的问题。。。 我的应用程序将在一个单独的线程上执行一些webservice调用。一旦webservice调用完成,它会将用户导航到不同的活动。 在用户按下home按钮或退出当前活动的情况下,如果webservice调用线程仍在运行,则应终止webservice。因此,我将线程终止方法置于OnPause状态 以下是线程内部运行的方法块: private Thread _webserviceThread; void WebserviceCallThread(){ WebRe

我遇到了一个奇怪的问题。。。 我的应用程序将在一个单独的线程上执行一些webservice调用。一旦webservice调用完成,它会将用户导航到不同的活动。 在用户按下home按钮或退出当前活动的情况下,如果webservice调用线程仍在运行,则应终止webservice。因此,我将线程终止方法置于OnPause状态

以下是线程内部运行的方法块:

private Thread _webserviceThread;

void WebserviceCallThread(){
    WebRestult result= WebserviceCall();
    if(!result.containsError()){
         RunOnUIThread(delegate{
             transitionToActivityXYZ();
         });
    }
}

void RunThreadAction(){
    _webserviceThread = new Thread(new ThreadStart(WebserviceCallThread));
    _webserviceThread.Start();
}


protected override void OnPause(){
    if(_webserviceThread != null && _webserviceThread.IsAlive){
        _webserviceThread.Abort();
    }

}
webservice调用完成并开始转换到另一个页面后,它将进入OnPause状态。然而,在一些奇怪的情况下,它会认为线程在OnPause状态下没有完成,即使活动转换是方法的最后一行

以前有人遇到过这个问题吗?如果是,你是如何解决这个问题的

谢谢

我总是用它来做这类事情。它不仅抽象了明确的线程处理,而且提供了钩子来完成您想要的一切;这也是一种很好的方式来表示可以从其他
活动中使用的
工作单元


post部分中有一个简单的示例,但它没有使用非常方便的通用参数。

为什么不使用任务并行库, 它是标准的.NET,对于AsyncTask,建议只对耗时不到几秒钟的任务使用它。见

AsyncTasks最好用于短期操作(几秒钟 如果您需要让线程长时间运行 同时,强烈建议您使用 java.util.concurrent

下面是如何使用任务并行库的示例,摘自


这项任务听起来很有前途!这就引出了我的另一个问题。。。Cancel方法是否只取消DoInBackground方法块中正在运行的内容?或者它在执行PostExecute时也会取消?正如文档所说,取消后,OnPostExecute将不会运行。如果您没有在DoInBackground中定期检查IsCancelled并显式中止,那么在DoInBackground完成之前,它实际上不会完成。它实际上只是一种防止OnPostExecute中的UI操作被执行的机制。我认为可观察到的效果正是您在示例中所追求的。谢谢!这真的很有帮助!这也很有帮助!谢谢
private void loginWithTaskLibrary()
{
    _progressDialog.Show();

    Task.Factory
        .StartNew(() =>
            _loginService.Login("greg")
        )
        .ContinueWith(task =>
            RunOnUiThread(() =>
                onSuccessfulLogin()
            )
        );
}