【问题标题】:Read callback data in new thread C#在新线程 C# 中读取回调数据
【发布时间】:2013-06-13 23:10:43
【问题描述】:

有人可以帮助我吗,我有一个方法可以调用“激活”回调方法(设置为每秒向我发送更改的数据)和每秒运行的第二种方法(首先“激活”)和给我数据。这很好,但我需要在新线程中运行第二种方法,经过几天的尝试和阅读,我无法做到这一点。有人可以指导我怎么做吗?这是我的代码。

    int ItemNumItems;
    Array ItemClientHandles;
    Array ItemServerValues;
    Array ItemQualities;
    Array ItemTimeStamps;

    public void Callback()
    {
        //Here I add a delegate with method to be called on data change.

        Grupa1.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(Grupa1_DataChange);
    }

    void Grupa1_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
    {
        //Here I read my data and pass them to my variables(and this is 
        //runned every second) and I want this method to run in new thread.

        ItemNumItems = NumItems;
        ItemClientHandles = ClientHandles;
        ItemServerValues = ItemValues;
        ItemQualities = Qualities;
        ItemTimeStamps = TimeStamps;
    } 

【问题讨论】:

    标签: multithreading callback icallbackeventhandler


    【解决方案1】:

    可能是这样的:

    void Grupa1_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
    {
        Array tmpClientHandles = ClientHandles;
        Array tmpItemValues = ItemValues;
        Array tmpQualities = Qualities;
        Array tmpTimeStamps = TimeStamps;
    
        ThreadPool.QueueUserWorkItem(o =>
        {
            //Here I read my data and pass them to my variables(and this is 
            //runned every second) and I want this method to run in new thread.
    
            ItemNumItems = NumItems;
            ItemClientHandles = tmpClientHandles;
            ItemServerValues = tmpItemValues;
            ItemQualities = tmpQualities;
            ItemTimeStamps = tmpTimeStamps;
       });
    } 
    

    ?

    但是你为什么要异步运行它呢?

    从您展示的代码来看,并行运行没有任何好处。

    【讨论】:

    • 你没有得到任何东西是对的,但我得到了一个任务,所以我必须这样做。 :) 但它不会那样工作,我得到:错误 1 ​​委托'System.Threading.WaitCallback' 不接受 0 参数并且对于所有数组错误 2 不能在匿名方法中使用 ref 或 out 参数 'ClientHandles',lambda 表达式, 或查询表达式
    • 我已经修复了第一个错误。你真的需要通过“ref”传递它们吗?无论如何你可以使用临时工,我会更新我的答案。
    • 首先我必须感谢您的帮助。该方法 Grupa1_DataChange 必须是这样的(带有 ref),因为它是这样定义的委托 DIOPCGroupEvent_DataChangeEventHandler 的一个实例,我无法更改它。 (它从一些 OPC 服务器读取数据,但这并不重要)
    • 我的更新(将“ref”参数复制到临时文件中)是否符合您的要求?
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多