转换的AsyncTask到任务MonoDroid的/ C# [英] Convert AsyncTask to Task in Monodroid/C#

查看:206
本文介绍了转换的AsyncTask到任务MonoDroid的/ C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道如何使用.NET的异步库来实现这个Android的AsyncTask:

 公共类LoadRecordTask:AsyncTask的
{
    私人活动1 _context;
    私人诠释_recordId;    公共LoadRecordTask(活性1 outerActivity,诠释的recordId)
    {
        _context = outerActivity;
        _recordId =的recordId;
    }    保护覆盖无效在preExecute()
    {
        base.On preExecute();        _progressDialog = Android.App.ProgressDialog.Show(_context,,加载记录{0},_recordId);
    }    保护覆盖的java.lang.Object DoInBackground(PARAMS的java.lang.Object [] @params)
    {
        _bSuccess = LoadRecord(_recordId);        如果(!_bSuccess)
        {
            返回false;
        }        返回true;
    }    保护覆盖无效OnPostExecute(的java.lang.Object结果)
    {
        base.OnPostExecute(结果);        如果(!_bSuccess)
        {
            _progressDialog.SetMessage(错误加载记录。);
        }        _progressDialog.Dismiss();
    }
}


解决方案

在您使用的是可以转化为类似于的AsyncTask

  _progressDialog = ProgressDialog.Show(_context,,加载记录{0},_recordId);如果(的await LoadRecord(_recordId))
    _progressDialog.Dismiss();
其他
    _progressDialog.SetMessage(错误加载记录。);

其中, LoadRecord 可返回任务<布尔> 内部运行的内部任务。否则,你可以只是包装您目前正在使用的任务的 LoadRecord ,使其运行异步。

 私人任务<布尔> LoadRecord(INT的recordId)
{
    返回任务<布尔> .RUN(()=>
    {
        //做的东西在这里获取记录
        返回true;
    });
}

您是从需求的呼叫等待方法被标记为异步。即:

 专用异步无效MyAwesomeAsyncMethod(){}

I was wondering how to implement this Android AsyncTask using .NET's async libraries:

public class LoadRecordTask : AsyncTask
{
    private Activity1 _context;
    private int _recordId;

    public LoadRecordTask( Activity1 outerActivity, int recordId )
    {
        _context = outerActivity;
        _recordId = recordId;
    }

    protected override void OnPreExecute()
    {
        base.OnPreExecute();

        _progressDialog = Android.App.ProgressDialog.Show( _context , "", "Loading record {0}", _recordId );
    }

    protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
    {
        _bSuccess = LoadRecord( _recordId );

        if( !_bSuccess )
        {
            return false;
        }

        return true;
    }

    protected override void OnPostExecute(Java.Lang.Object result)
    {
        base.OnPostExecute(result);

        if( !_bSuccess )
        {           
            _progressDialog.SetMessage( "Error loading recording." );
        }

        _progressDialog.Dismiss();
    }
}

解决方案

The AsyncTask you are using could be translated to something like:

_progressDialog = ProgressDialog.Show( _context , "", "Loading record {0}", _recordId );

if (await LoadRecord(_recordId))
    _progressDialog.Dismiss();
else
    _progressDialog.SetMessage( "Error loading recording." );

Where LoadRecord could be returning Task<bool> and the internals running inside of Task. Otherwise you can just wrap the LoadRecord method you are currently using in a Task to make it run async.

private Task<bool> LoadRecord(int recordId)
{
    return Task<bool>.Run(() => 
    {
        //Do stuff here to fetch records
        return true;
    });
}

The method you are calling await from needs to be marked as async. I.e.:

private async void MyAwesomeAsyncMethod() {}

这篇关于转换的AsyncTask到任务MonoDroid的/ C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆