HarmonyOS鸿蒙Next中Concurrent注解的函数内访问函数或成员变量会编不过
HarmonyOS鸿蒙Next中Concurrent注解的函数内访问函数或成员变量会编不过
@Concurrent注解的函数里,访问全局函数、参数的成员变量、成员函数都会报错,感觉该函数里也干不了啥了
[@Concurrent](/user/Concurrent)
function add(a: number, b: number): number {
return a + b;
}
function next() {
throw new Error('this error');
}
[@Concurrent](/user/Concurrent)
function testException(a: null | Person): Person | null {
if (a != null) {
next();
add(1, 2);
AsyncLog.i(a.name);
}
return a;
}
报错信息: ERROR: Error: Concurrent function should only use import variable or local variable, ‘next’ is not one of them [TaskPoolDemo.ts:32:8] the size of programs is expected to be 11, but is 10
更多关于HarmonyOS鸿蒙Next中Concurrent注解的函数内访问函数或成员变量会编不过的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者,您好。目前taskpool的 @Concurrent 不支持调用对象的内部方法,已有相关需求。
对于普通方法,可使用以下两种方式
可以使用这种方式把方法作为入参,然后使用
let task = new taskpool.Task(aaa, bbb);
@Concurrent
function aaa(func: Function) {
func();
}
@Concurrent
function bbb() {
}
也可以把方法写在其他的.ets文件中,再import导入,就可以使用
1月份版本会提供 @Sendable 装饰器,支持调用对象方法。
更多关于HarmonyOS鸿蒙Next中Concurrent注解的函数内访问函数或成员变量会编不过的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,@Concurrent注解用于标记一个函数为并发执行。并发函数在执行时会与主线程分离,因此在这些函数内部访问主线程的函数或成员变量可能会导致编译错误。这是因为并发函数运行在不同的线程上下文中,无法直接访问主线程的资源。
具体来说,@Concurrent注解的函数在执行时会被调度到一个独立的线程池中运行,而不是在主线程中执行。因此,如果在这些函数中直接访问主线程的函数或成员变量,编译器无法保证线程安全性,从而会报错。
要解决这个问题,可以通过传递参数的方式将所需的数据传递给并发函数,或者使用线程安全的机制(如原子变量、锁等)来确保对共享资源的访问是安全的。此外,鸿蒙系统提供了一些线程间通信的机制,如EventHandler和EventRunner,可以用于在并发函数和主线程之间传递消息或数据。
总之,@Concurrent注解的函数内访问主线程的函数或成员变量会导致编译错误,因为这些操作涉及到线程安全问题。


