C # делегат возвращает обратно NULL - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь выучить делегат и не уверен, что делаю неправильно.Итак, у меня есть три класса, Form1, Class1 и Class2.Form1 вызывает метод Class1 для установки строки для члена Class1, а затем Form1 запускает рабочий поток для запуска Class2.Но когда Class2 вызывает метод делегата Form1, который вызовет метод Class1 для получения строковых данных, но он возвращает обратно в Class2 как ноль.

Так что именно здесь он возвращает ноль, >> 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);
        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();
    }

}

Это 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();
    }
}

1 Ответ

2 голосов
/ 23 марта 2012

Проблема в Form1.Class1GetData методе.Когда вы звоните form1Obj.gDelegateClass1GetData() в Class2.AddString(), вы на самом деле звоните Form1.Class1GetData.InvokeRequired возвращает true, и вам нужно снова позвонить Form1.Class1GetData.На этот раз InvokeRequired возвращает false, и вы звоните class1Obj.GetClass1Data(), и возвращает "Hello".На самом деле он возвращается к первому вызову Form1.Class1GetData, но вы возвращаете null наконец.Итак, вы получаете null до string str = form1Obj.gDelegateClass1GetData(();.Попробуйте исправить это как

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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...