HarmonyOS 鸿蒙Next 多线程worker 内 onMessage 内的代码不执行 也无异常log

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 多线程worker 内 onMessage 内的代码不执行 也无异常log

workerPort.onmessage = async (e: MessageEvents) => {
switch (e.data.type as number) {
case 0:
console.info(‘worker SyncWorker’, ‘onmessage start’)
=====> 这里的log 打出来了,下边 syncRemoteConversations内的所有log都没有打出

await ConversationSyncTask2.syncRemoteConversations()
let conversation = new Conversation()
conversation.conversationNo = e.data.data;
console.info(‘worker SyncWorker’, ‘onmessage’, e.data.data)
========> 这个 log 也没有打出
workerPort.postMessage(JsonUtil.stringify(conversation));
default :
break;
}
}

** ConversationSyncTask2 类 方法全是静态的, 内部为实际业务实现,比较复杂,
** 起初有用到 Observe装饰的class 有异常,后去掉了Observe装饰不报异常,但变成什么也不输出,完全不知道里边发生了什么

** 通过官网那么有限的介绍,完全不知道 worker 内到底能写“什么代码”,
我写过,就 for (let i = 0 ; i < 10000; ii) {} 这种代码行,似乎不能再有一丢丢复杂的代码,
能给出一个明确定义,里头能干啥?

ConversationSyncTask2 {
static async syncRemoteConversations() {
TimeLine.stopAllConversation();

let lastChatTime = ConversationSyncTask2.getLastTime();
Logger.info('ConversationSyncTask lastChatTime: ’ + lastChatTime);
let result = await HttpIMPresent.queryRemoteConversations(lastChatTime);
//此次会话的更新时间点,为服务器当前时间再提前10分钟,为了能够更好的拉取服会话变更
////this.conversationUpdateTime = result.server_timestamp - 10 * 60 * 1000;

//todo 稍后处理会话拉取

if (result.isSuccess() && result.data != null && result.data.length > 0) {
let changeConversationRsps = result.data;
//本地没有变更的会话,启动其timeline
await ConversationSyncTask2.startUnChangeConversationTimeLine(changeConversationRsps);
// 可能可以之前不stopall、只stop有变更的,主要看TimeLine内的 enable enableConversation 变量条件使用

let time1 = TimeUtil.getCurrentTimeMillis();
let conversationList = await ConversationSyncTask2.conversationRespsToConversations(changeConversationRsps);
let time2 = TimeUtil.getCurrentTimeMillis();
Logger.info('ConversationSyncTask costTime1: ’ + (time2 - time1));
//批量插入
let convDao = IMConversationDB.getCurInstance().getConversationDao();
await convDao.batchInsert(conversationList);
let time3 = TimeUtil.getCurrentTimeMillis();
Logger.info('ConversationSyncTask costTime2: ’ + (time3 - time2));
。。。
。。
}
}


更多关于HarmonyOS 鸿蒙Next 多线程worker 内 onMessage 内的代码不执行 也无异常log的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

单例建议在主线程使用,子线程会多次初始化,获取context可通过主线程传值

        let contex = getContext() as  common.UIAbilityContext;
         worker1.postMessage({"context":contex});

获取

console.log(JSON.stringify(e.data.context));

更多关于HarmonyOS 鸿蒙Next 多线程worker 内 onMessage 内的代码不执行 也无异常log的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的HarmonyOS鸿蒙Next多线程worker中onMessage内的代码不执行且无异常log的问题,可能的原因包括消息未被正确投递到worker线程、onMessage方法内部存在阻塞或死锁、或者消息处理逻辑被异常中断但未捕获记录。

首先,请确保您的worker线程已正确启动并处于监听状态。检查消息队列的初始化与消息发送的代码,确保消息对象被正确构造并投递到目标worker的队列中。

其次,审查onMessage方法内部代码,确认无死循环、长时间阻塞操作或资源竞争导致的死锁情况。同时,检查是否有异常被抛出但未被捕获处理,可以在方法开始处添加try-catch块,捕获并记录所有异常。

此外,考虑到日志系统可能未捕获到关键信息,检查日志配置,确保日志级别足够详细,能够记录到线程调度、消息处理等关键事件。

如果以上步骤均未能解决问题,建议通过HarmonyOS开发者社区或相关论坛寻求帮助,或直接联系官方技术支持。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部