如何从WCF回调类更新GUI标签?

时间:2013-12-06 00:46:16

标签: c# wcf user-interface callback

我正试图弄清楚如何从我的WCF回调类:MyCallBack中访问我的GUI类:WinClient中的方法。方法MyCallBack.JoinServiceCallback(string message)正在运行,例如,如果我使用MessageBox.Show(message);它可以正常工作。

我在GUI类中有一个方法SetLabelMsg(string message){}。但我无法弄清楚如何从回调类访问它。我对C#比较新,我一直在查看Delegate和threads并调用它。但我似乎无法连接点。希望有人能够帮助我!

//this method should change te text of the GUI label
public class MyCallBack : IServiceCallback
{
    //this method should change the text of the GUI label
    public void JoinServiceCallback(string message)
    {
        MessageBox.Show(message + " joined the service");
    }
}


public partial class WinClient : Form
{
    public void SetLabelMsg(string message)
    {
        lblMsg.Text = message;
    }
}

2 个答案:

答案 0 :(得分:1)

我得到了一位同学的大力帮助。

public class MyCallBack : IServiceCallback
{
    private static Action<string> _changeText = null;

public static void SetDelegate(Action<string> nAction)
{
    _changeText = nAction;
}

public void JoinServiceCallback(string message)
{
    if(_changeText != null)
    {
        _changeText(message);
    }
}
}


public partial class WinClient : Form
{

public WinClient(Customer customer)
{
    MyCallBack.SetDelegate(SetLabelMsg);

    public void SetLabelMsg(string message)
    {
        lblMsg.Text = message;
    }
}
}

答案 1 :(得分:0)

如果我根据提供的信息正确理解了问题。我会定义一个可以收到消息的delegate。然后定义在event类中使用它的MyCallBack

/// <summary>Represents the method that can recieve a message.</summary>
/// <param name="message">The message.</param>
internal delegate void SendMessage(string message);

/// <summary>Occurrs when the JoinServiceCallback method is invoked.</summary>
public event SendMessage AfterJoinServiceCallback;

表单可以附加到AfterJoinServiceCallback上的JoinServiceCallback事件,然后if (AfterJoinServiceCallback != null) { AfterJoinServiceCallback(message) } 可以举起活动。

message

### BEGIN EDIT ###

我认为问题可能是我的原始示例在委托声明中定义了2个参数,但调用只传递了JoinServiceCallback

我很高兴您有一些工作要做,但是,如果您在UI中有多个位置需要在调用JoinServiceCallback时收到通知,那么您应该真正关注Using Delegates (C# Programming Guide)。使用委托,public partial class WinClient : Form { public WinClient() { InitializeComponent(); // Attach the "SetLabelMsg" method to the event MyCallBack.AfterJoinServiceCallback += SetLabelMsg; // Attach the "ShowMessage" method to the event MyCallBack.AfterJoinServiceCallback += ShowMessage; } private void SetLabelMsg(string message) { if (!string.IsNullOrEmpty(message)) { // Update the status label lblMsg.Text = string.Format("Time: {1}\t\tMessage: {0}", message, DateTime.Now); } } private void ShowMessage(string message) { if (!string.IsNullOrEmpty(message)) { // Add the message to a listbox of all messages listLog.Items.Add(string.Format("Time: {1}\t\tMessage: {0}", message, DateTime.Now)); } } } public class MyCallBack : IServiceCallback { public delegate void SendMessage(string message); public static event SendMessage AfterJoinServiceCallback; public void JoinServiceCallback(string message) { if (AfterJoinServiceCallback != null) { AfterJoinServiceCallback(message); } } } 方法内的调用将是相同的,但会按照它们附加的顺序调用所有附加的目标方法。

{{1}}