1)、AsyncTask一套基于线程池的异步任务处理系统。每创建一个AsyncTask,都会被加入到线程池中进行执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #pragma once #include "Async/AsyncWork.h" class FMyAsyncTask : public FNonAbandonableTask{ friend class FAutoDeleteAsyncTask <FMyAsyncTask>; public : FMyAsyncTask (); void DoWork () ; FORCENOINLINE TStatId GetStatId () const { RETURN_QUICK_DECLARE_CYCLE_STAT (FMyAsyncTask, STATGROUP_ThreadPoolAsyncTasks); } FORCENOINLINE static const TCHAR* GetTaskName () { return TEXT ("FMyAsyncTask" ); } }; #include "MyAsyncTask.h" FMyAsyncTask::FMyAsyncTask () { } void FMyAsyncTask::DoWork () { UE_LOG (LogTemp, Warning, TEXT ("FMyAsyncTask" )); for (int i = 0 ; i < 1000000 ; ++i) { UE_LOG (LogTemp, Warning, TEXT ("i = %d" ), i); } } void AUE521TESTCharacter::TestAsyncTaskClass () { FAutoDeleteAsyncTask<FMyAsyncTask>* MyTask = new FAutoDeleteAsyncTask <FMyAsyncTask>(); MyTask->StartBackgroundTask (); }
总结 主要应用于后台线程上加载资源、进行复杂的计算、或者执行其他可能会阻塞主线程的操作。
2)、Async最简单创建异步的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 #include "Async/Async.h" void AUE521TESTCharacter::TestAsync () { Async (EAsyncExecution::ThreadPool, []() { for (int i = 0 ; i < 1000000 ; ++i) { UE_LOG (LogTemp, Warning, TEXT ("i = %d" ), i); } }); }
3)、FRunnable1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #pragma once class FMyRunnable : public FRunnable{ public : virtual uint32 Run () override ; }; #include "MyRunnable.h" uint32 FMyRunnable::Run () { for (int i = 0 ; i < 1000000 ; ++i) { UE_LOG (LogTemp, Warning, TEXT ("i = %d" ), i); } return 0 ; } void AUE521TESTCharacter::TestRunnable () { FMyRunnable* MyRunnable = new FMyRunnable (); FRunnableThread* MyThread = FRunnableThread::Create (MyRunnable, TEXT ("MyThread" )); }
4)、三种方式区别1)、AsyncTask:AsyncTask是一个模板类,用于创建可以在后台线程上运行的任务。AsyncTask可以在任务完成后自动删除自己,它非常适合用于创建一次性的异步任务。例如,你可以使用AsyncTask来异步加载资源,或者进行一次复杂的计算。 2)、Async:Async是一个函数,用于在后台线程上运行一个lambda表达式。Async函数的使用方式非常简单,只需要一个lambda表达式,可以创建一个异步任务。Async函数非常适合用于创建简单的异步任务,例如异步加载资源,或者进行一次复杂的计算。 3)、FRunnable:FRunnable是一个接口,用于创建可以在单独线程上运行的任务。与AsyncTask和Async不同,FRunnable任务需要手动管理线程的生命周期,这使得它更加灵活,但也更难使用。FRunnable非常适合用于创建复杂的异步任务,例如创建一个后台线程,这个线程可以持续运行并处理来自网络的数据。 总的来说,AsyncTask和Async更适合用于创建一次性的异步任务,而FRunnable更适合用于创建需要长时间运行的异步任务