#跟着坚果学鸿蒙#ArkTS 之Task<下>
·
Task 表示任务。使用constructor方法构造Task。任务可以多次执行或放入任务组执行或放入串行队列执行或添加依赖关系执行。
方法示例:
- sendData:在任务执行过程中向宿主线程发送消息并触发回调。使用该方法前需先构造Task。
@Concurrent
function sendDataTest(num: number): number {
let res: number = num * 10;
taskpool.Task.sendData(res);
return num;
}
function printLog(data: number): void {
console.info("taskpool: data is: " + data);
}
async function taskpoolTest(): Promise<void> {
try {
let task: taskpool.Task = new taskpool.Task(sendDataTest, 1);
task.onReceiveData(printLog);
await taskpool.execute(task);
} catch (e) {
console.error(`taskpool: error code: ${e.code}, info: ${e.message}`);
}
}
taskpoolTest();
- onReceiveData:为任务注册回调函数,以接收和处理来自任务池工作线程的数据。使用该方法前需先构造Task。
@Concurrent
function ConcurrentFunc(num: number): number {
let res: number = num * 10;
taskpool.Task.sendData(res);
return num;
}
function printLog(data: number): void {
console.info("taskpool: data is: " + data);
}
async function testFunc(): Promise<void> {
try {
let task: taskpool.Task = new taskpool.Task(ConcurrentFunc, 1);
task.onReceiveData(printLog);
await taskpool.execute(task);
} catch (e) {
console.error(`taskpool: error code: ${e.code}, info: ${e.message}`);
}
}
testFunc();
- onStartExecution:注册一个回调函数,并在执行任务前调用它。需在任务执行前注册,否则会抛异常。
import { taskpool } from '@kit.ArkTS';
@Concurrent
function delay(args: number): number {
let t: number = Date.now();
while ((Date.now() - t) < 1000) {
continue;
}
return args;
}
let task: taskpool.Task = new taskpool.Task(delay, 1);
task.onStartExecution(() => {
console.info("taskpool: onStartExecution");
});
taskpool.execute(task).then(() => {
console.info("taskpool: execute task success");
});
- onExecutionFailed:注册一个回调函数,并在任务执行失败时调用它。需在任务执行前注册,否则会抛异常。
import { taskpool } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';
import { HashMap } from '@kit.ArkTS';
@Concurrent
function test(args: number) {
let t = Date.now();
while ((Date.now() - t) < 100) {
continue;
}
let hashMap1: HashMap<string, number> = new HashMap();
hashMap1.set('a', args);
return hashMap1;
}
let task2 = new taskpool.Task(test, 1);
task2.onExecutionFailed((e: Error) => {
console.info("taskpool: onExecutionFailed error is " + e);
})
taskpool.execute(task2).then(() => {
console.info("taskpool: execute task success");
}).catch((e:BusinessError) => {
console.error(`taskpool: error code: ${e.code}, error info: ${e.message}`);
})
- onExecutionSucceeded:注册一个回调函数,并在任务执行成功时调用它。需在任务执行前注册,否则会抛异常。
import { taskpool } from '@kit.ArkTS';
@Concurrent
function delay(args: number): number {
let t: number = Date.now();
while ((Date.now() - t) < 1000) {
continue;
}
return args;
}
let task: taskpool.Task = new taskpool.Task(delay, 1);
task.onExecutionSucceeded(() => {
console.info("taskpool: onExecutionSucceeded");
});
taskpool.execute(task).then(() => {
console.info("taskpool: execute task success");
});
- isDone:检查任务是否已完成。
@Concurrent
function inspectStatus(arg: number): number {
// 2s sleep
let t: number = Date.now();
while (Date.now() - t < 1000) {
continue;
}
return arg + 1;
}
async function taskpoolCancel(): Promise<void> {
let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number
taskpool.execute(task).then((res: Object) => {
console.info("taskpool test result: " + res);
}).catch((err: string) => {
console.error("taskpool test occur error: " + err);
});
setTimeout(() => {
if (!task.isDone()) {
taskpool.cancel(task);
}
}, 3000); // 延时3s,确保任务已执行
}
taskpoolCancel();
更多推荐
所有评论(0)