C#Delegate返回NULL [英] C# Delegate returns back NULL

查看:168
本文介绍了C#Delegate返回NULL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试学习代表,不知道我做错了什么。所以我有三个类,Form1,Class1和Class2。 Form1调用Class1方法为Class1成员设置一个字符串,然后Form1启动workerbackground线程来启动Class2。但是当Class2调用Form1代理方法,它将调用Class1方法来获取字符串数据,但它返回到Class2为空。



所以这是它返回null, > string str = form1Obj.gDelegateClass1GetData(();



这是Form1:

  public delegate string DelegateClass1GetData(); 
public delegate void DelegateClass1SetData(string data);

public partial class Form1:Form
{
public DelegateClass1GetData gDelegateClass1GetData ;
public DelegateClass1SetData gDelegateClass1SetData;

public Class1 class1Obj;
public BackgroundWorker bw_Class2;
public Class2 class2Obj;


public Form1()
{
InitializeComponent();

class1Obj = new Class1();
class2Obj = new Class2(this);


gDelegateClass1GetData = new DelegateClass1GetData(this.Class1GetData);
gDelegateClass1SetD ata = new DelegateClass1SetData(this.Class1SetData);
}


private void button1_Click(object sender,EventArgs e)
{
class1Obj.setClass1Data(Hello);

bw_Class2 = new BackgroundWorker();
bw_Class2.WorkerSupportsCancellation = true;

bw_Class2.DoWork + = new DoWorkEventHandler(ThreadClass2_DoWork);
bw_Class2.RunWorkerAsync();
}


public string Class1GetData()
{
if(InvokeRequired)
调用(新的DelegateClass1GetData(Class1GetData));
else
{
return class1Obj.GetClass1Data();
}

返回null;



public void Class1SetData(string data)
{
if(InvokeRequired)
调用(新的DelegateClass1SetData(Class1SetData),数据);
else
{
class1Obj.setClass1Data(data);
}
}


public void ThreadClass2_DoWork(object sender,DoWorkEventArgs e)
{
string str1 = class1Obj.GetClass1Data();
class2Obj.AddString();
}

}

这是Class1:

  public class Class1 
{
public string gClass1Data;

public Class1()
{
gClass1Data = null;
}


public void setClass1Data(string data)
{
gClass1Data = data;
}


public string GetClass1Data()
{
return gClass1Data;
}
}

这个Class2:

  public class Class2 
{

public Form1 form1Obj;

public Class2(Form1 obj)
{
form1Obj = obj;
}


public void AddString()
{
string str = form1Obj.gDelegateClass1GetData();
str = str +Delegate;

form1Obj.gDelegateClass1SetData(str);
string str2 = form1Obj.gDelegateClass1GetData();
}
}


解决方案

问题在 Form1.Class1GetData 方法中。当您在 Class2.AddString()中调用 form1Obj.gDelegateClass1GetData()时,实际调用 Form1.Class1GetData InvokeRequired 返回 true ,您必须调用 Form1.Class1GetData 再次。这一次,$ code> InvokeRequired return false ,你调用 class1Obj.GetClass1Data(),并返回Hello。它实际上返回到 Form1.Class1GetData 的第一个调用,但是最终返回 null 。所以,你得到 null string str = form1Obj.gDelegateClass1GetData((); p>

  public string Class1GetData()
{
if(InvokeRequired)
return(string)Invoke新的DelegateClass1GetData(Class1GetData)); //返回第一次调用Class1GetData
else
{
return class1Obj.GetClass1Data();
}

/ / return null; //不要返回null
}


I'm trying to learn delegate and not sure what I do wrong. So I have three classes, Form1, Class1, and Class2. Form1 calls Class1 method to set a string for Class1 member and then Form1 starts workerbackground thread to start Class2. But when Class2 calls Form1 delegate method which will call Class1 method to get string data, but it returns back to Class2 as null.

So this is where it returns null,>> string str = form1Obj.gDelegateClass1GetData(();

This is Form1:

public delegate string DelegateClass1GetData();
public delegate void DelegateClass1SetData(string data);

public partial class Form1 : Form
{
    public DelegateClass1GetData gDelegateClass1GetData;
    public DelegateClass1SetData gDelegateClass1SetData;

    public Class1 class1Obj;
    public BackgroundWorker bw_Class2;
    public Class2 class2Obj;


    public Form1()
    {
        InitializeComponent();

        class1Obj = new Class1();
        class2Obj = new Class2(this);


        gDelegateClass1GetData = new DelegateClass1GetData(this.Class1GetData);
        gDelegateClass1SetData = new DelegateClass1SetData(this.Class1SetData);
    }


    private void button1_Click(object sender, EventArgs e)
    {
        class1Obj.setClass1Data("Hello");

        bw_Class2 = new BackgroundWorker();
        bw_Class2.WorkerSupportsCancellation = true;

        bw_Class2.DoWork += new DoWorkEventHandler(ThreadClass2_DoWork);
        bw_Class2.RunWorkerAsync();
    }


    public string Class1GetData()
    {
        if (InvokeRequired)
            Invoke(new DelegateClass1GetData(Class1GetData));
        else
        {
            return class1Obj.GetClass1Data();
        }

        return null;
    }


    public void Class1SetData(string data)
    {
        if (InvokeRequired)
            Invoke(new DelegateClass1SetData(Class1SetData), data);
        else
        {
            class1Obj.setClass1Data(data);
        }
    }


    public void ThreadClass2_DoWork(object sender, DoWorkEventArgs e)
    {
        string str1 = class1Obj.GetClass1Data();
        class2Obj.AddString();
    }

}

This is Class1:

public class Class1
{
    public string gClass1Data;

    public Class1()
    {
        gClass1Data = null;
    }


    public void setClass1Data(string data)
    {
        gClass1Data = data;
    }


    public string GetClass1Data()
    {
        return gClass1Data;
    }
}

This Class2:

public class Class2
{

    public Form1 form1Obj;

    public Class2(Form1 obj)
    {
        form1Obj = obj;
    }


    public void AddString()
    {
        string str = form1Obj.gDelegateClass1GetData();
        str = str + " Delegate";

        form1Obj.gDelegateClass1SetData(str);
        string str2 = form1Obj.gDelegateClass1GetData();
    }
}

解决方案

The problem is in Form1.Class1GetData method. When you call form1Obj.gDelegateClass1GetData() in Class2.AddString(), you actually call Form1.Class1GetData. InvokeRequired returns true, and you have to call Form1.Class1GetData again. This time, InvokeRequired return false, and you call class1Obj.GetClass1Data(), and returns "Hello". It actually returns to the first call to Form1.Class1GetData, but you return null finally. So, you get null to string str = form1Obj.gDelegateClass1GetData(();. Try to fix it as

public string Class1GetData()
{
    if (InvokeRequired)
        return (string) Invoke(new DelegateClass1GetData(Class1GetData)); // return the first call to Class1GetData
    else
    {
        return class1Obj.GetClass1Data();
    }

    //return null; // Don't return null.
}

这篇关于C#Delegate返回NULL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆