You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用DLL回调函数的作用域问题,如何存储回调接收的数据

解决方案

核心是把存储消息的实例放到回调函数的作用域外部,保证实例全局唯一,不会每次回调触发时被重新创建,同时处理好多线程安全问题(DLL推送回调通常运行在后台线程,普通List不支持多线程并发写入)。

1. 调整消息存储类

public class MessageReceived
{
    private readonly List<string> _messages = new();
    // 加锁保证多线程写入安全
    private readonly object _lock = new();

    public void AddMessage(string content)
    {
        lock (_lock)
        {
            _messages.Add(content);
        }
    }

    // 对外提供读取接口,返回副本避免外部修改内部存储
    public List<string> GetAllMessages()
    {
        lock (_lock)
        {
            return new List<string>(_messages);
        }
    }
}

2. 在DLLConnector中声明全局静态存储实例

因为你当前的回调是静态方法,所以将存储实例作为DLLConnector的静态成员,生命周期和类绑定,全程只会初始化一次:

partial class DLLConnector
{
    // 全局唯一的消息存储实例
    public static readonly MessageReceived MessageStore = new();
    
    // 原有代码保持不变:DllImport声明、委托定义、回调实例初始化等
    // ...
}

3. 回调函数中直接调用全局实例存数据

public static void DataUpdateCallback([MarshalAs(UnmanagedType.LPWStr)] string updatedData)
{
    Console.WriteLine(updatedData);
    // 直接写入全局存储,不会新建对象
    DLLConnector.MessageStore.AddMessage(updatedData);
}

外部读取数据方法

任意业务代码都可以通过 DLLConnector.MessageStore.GetAllMessages() 获取所有已存储的回调消息。


额外提示:如果你的DLL回调需要触发UI更新,需要主动将操作调度到UI线程执行,避免跨线程访问异常。

内容的提问来源于stack exchange,提问作者roccaforte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:54:05