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
// Fill out your copyright notice in the Description page of Project Settings.
//MyAsyncTask.h
#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");
}
};
// MyAsyncTask.cpp
#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);
}
}

//UE521TESTCharacter.cpp
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
// UE521TESTCharacter.cpp
#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)、FRunnable

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
//MyRunnable.h
#pragma once
class FMyRunnable : public FRunnable
{
public:
virtual uint32 Run() override;
};

//MyRunnable.cpp
#include "MyRunnable.h"
uint32 FMyRunnable::Run()
{

for (int i = 0; i < 1000000; ++i)
{
UE_LOG(LogTemp, Warning, TEXT("i = %d"), i);
}

return 0;
}
// UE521TESTCharacter
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更适合用于创建需要长时间运行的异步任务