愁死了。。。回调函数不执行

就爱麦田圈 2017-09-25 05:59:46
很奇怪的,麻烦那个大神给看看
打断点运行到a.ADD(CompleteInfo);的时候,不会进CompleteInfo(),所以aa 没有值
但是很奇怪,加个弹框aa 就有值了

public class A
{
public delegate void Complete ();
public void ADD(Complete callback);
}
public class B
{
String aa = " ";
String bb = " ';
private DataTable showData()
{
DataTable mydt = new DataTable();
mydt.Columns.Add("名字", Type.GetType("System.String"));
mydt.Columns.Add("年龄", Type.GetType("System.String"));
A a = new A();
a.ADD(CompleteInfo);
//MessageBox.Show(" ");-----必须要在这里加弹窗 aa 才用值怎么回事啊
mydr[0] = aa ;
mydr[1] = bb;
mydt.Rows.Add(mydr);
}

private void CompleteInfo()
{
aa = "你好";
bb = “啊";
}
}
...全文
586 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdfgrtyu 2017-09-26
  • 打赏
  • 举报
回复
乱七八糟完全看不明白,都编译不过去,,,
就爱麦田圈 2017-09-26
  • 打赏
  • 举报
回复
 private void button1_Click(object sender, EventArgs e)
        {
            _marsCtrlSystem.GetControlSysInfo(OnCompleteHWInfoConfig);
            //MessageBox.Show("");
            Application.DoEvents();
            String s = allControlInfo[0][0];

        }
加上Application.DoEvents(); 还是不行啊,allControlInfo 还是会报空指针,但是加上/MessageBox.Show(""); 又有值了
Saleayas 2017-09-25
  • 打赏
  • 举报
回复
在回调函数中不要执行动作,而是直接 DEBUG 参数。 看看是否执行了。 很多执行的动作都可能是需要处理消息的。此时消息是顺序 执行的。 没有执行完成上一个消息,是不会执行下一个消息的。 你可以使用 DoEvent 来强制消息循环。 执行一个MessageBox 的话,他会呼叫 DoEvent 的。
就爱麦田圈 2017-09-25
  • 打赏
  • 举报
回复
你的意思是 public void ADD(Complete callback); 没有执行callback(),那应该怎么调用我还是不太明白? 我现在用的是第三方封装好的 SDk , _mars.GetControlSysInfo(OnCompleteHWInfoConfig); 我想要执行这个函数,然后OnCompleteHWInfoConfig()方法返回的参数填入dataGridview,,但是死活获取的值是空的 然后在这个方法前,加个弹框,表格的值又能够显示出来了。
ilikeff8 2017-09-25
  • 打赏
  • 举报
回复
不是有的么

    class Program
    {
        static void Main(string[] args)
        {
            new B().showData();            
        }
    }

    public class A
    {
        public delegate void Complete();
        public void ADD(Complete callback)
        {
            callback();
        }
    }
    public class B
    {
        String aa = " ";
        String bb = " ";
        public DataTable showData()
        {
            DataTable mydt = new DataTable();
            mydt.Columns.Add("名字", Type.GetType("System.String"));
            mydt.Columns.Add("年龄", Type.GetType("System.String"));
            A a = new A();
            a.ADD(CompleteInfo);

            Console.Write(aa); // 你好
            Console.Read();

            return mydt;
        }

        private void CompleteInfo()
        {
            aa = "你好";
            bb = "啊";
        }
    }
}
正怒月神 2017-09-25
  • 打赏
  • 举报
回复
看起来,加了弹框也不会有值啊。
因为你只给委托赋值,却没有调用。所以没有执行CompleteInfo,aa和bb应该没变化啊。
你看看下面这个是正常的方法。Action你可以改成delegate的声明方式。
        private void button1_Click(object sender, EventArgs e)
{
A m = new A();
m.Add(Test);
m.a();
MessageBox.Show(a + " " + b);
}

string a = "";
string b = "";
public void Test()
{
a = "hello ";
b = "world ";
}

}

public class A
{
public Action a;
public void Add(Action f)
{
a=f;
}
}

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧