【问题标题】:Android AsyncTask-like functionality in C# (.NET)C# (.NET) 中的类似 Android AsyncTask 的功能
【发布时间】:2011-09-15 12:18:06
【问题描述】:

您可能知道,Android 的 SDK 具有一个 AsyncTask 类,它允许在单独的线程上执行代码并在主 (UI) 线程中获取结果。简而言之,是这样的:

class AsyncTask
{
   void onPreExecute(...)
   {
       //Executed on the main thread BEFORE the secondary thread gets to work on anything.
   }

   void execute(...)
   {
       //This runs on the secondary thread.
   }

   void onPostExecute(...)
   {
       //This runs on the main thread AFTER the secondary thread finishes work. You get the result here in the form of some data type.
   }
}

当然,这只是一个粗略的方案,但如果您不熟悉它,它应该提供有关 AsyncTask 的足够信息。基本上,我在 Microsoft 的 .NET Framework 中寻找相同的功能。

在我开始编写自己的类来执行此操作之前,我想确定没有任何东西可以让我在框架中获得所需的结果。我正在使用.NET 4.0。也许某种“聪明”的 System.Threading.Tasks.Task 使用?不知道,我把这个留给你。

简而言之,我想将一些输入传递给一个函数,在辅助线程上运行代码,并在完成时通过主线程更新一些 UI 元素。锁定主线程(例如通过Task.Wait())不能很好地满足我的要求。

【问题讨论】:

    标签: c# java android .net task


    【解决方案1】:

    您可以使用 .Net 中的 Task 类实现您想要的。

    以下是一些有助于您入门的代码:

    var task = Task.Factory.StartNew(() => YourMethodGoesHere());
    
    task.ContinueWith(t => UpdateYourUiInThisContinuation(),
                      TaskScheduler.FromCurrentSynchronizationContext());
    
    task.ContinueWith(t => HandleAnExceptionWhichTheTaskMayThrow(), 
                       TaskContinuationOptions.OnlyOnFaulted);
    

    这将安排 YourMethodGoesHere() 运行 UI 线程。延续,UpdateYourUiInThisContinuation() 将安排在初始任务完成后运行,我使用的重载将强制它在同一同步上下文中继续(UI 线程,假设最初在 UI 线程上调用此代码)。

    最后一个延续是处理任务中代码可能抛出的任何异常的好习惯。如果你不处理它(除了使用这个延续之外还有其他方法),你最终会得到一个未处理的 AggregateException。

    【讨论】:

    • 谢谢!这成功了。我在我的函数中处理了异常。结果返回错误消息对我来说似乎更舒服:)
    • 这似乎没有实现publishProgress 接口。有什么等价的吗?
    【解决方案2】:

    您可以使用 BackgroundWorker 类创建一个抽象类

    public abstract class AsyncTask
    {
        private BackgroundWorker bw;
    
        public AsyncTask()
        {
            bw = new BackgroundWorker();
            bw.DoWork += (s,e)=> { DoInBackground(); };
            bw.RunWorkerCompleted += (s, e) => { TaskCompleted(); };
        }
    
        protected abstract void PreExecute();
        protected abstract void DoInBackground();
        protected abstract void TaskCompleted();
    
        public void Execute() {
            PreExecute();
            bw.RunWorkerAsync();
        }
    }
    

    像 Android 中的 AsyncTask 一样实现它

    private class ExampleTask : AsyncTask
        {
            protected override void DoInBackground()
            {
                //Background process. 2nd thread
            }
    
            protected override void PreExecute()
            {
                //Main thread. Before executing DoInBackground
            }
    
            protected override void TaskCompleted()
            {
                //Main thread. Task Completed
            }
        }
    

    并调用 Execute()

    new ExampleTask().Execute();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2022-01-23
      相关资源
      最近更新 更多