C#Delegate返回NULL [英] C# Delegate returns back NULL
问题描述
所以这是它返回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屋!