WCF服务服务器抛出异常无法访问已处置的对象

时间:2014-05-19 22:30:41

标签: c# wcf events service delegates

所以我的服务是两个wcf客户端之间的简单聊天应用程序。当我调用事件时,事件回调会起作用。关闭我的客户端并再次运行它,然后再次写一条消息(调用该事件)它会抛出异常:

An exception of type 'System.ObjectDisposedException' occurred in
RussianRouletteServiceLibrary.dll but was not handled in user code

Additional information: Cannot access a disposed object.

我的服务回调代码如下:

    private static Action<User, UMessage> gameChat = delegate { };

    public void Play()
    {
        IGameCallback subscriber =
                   OperationContext.Current.GetCallbackChannel<IGameCallback>();
        gameChat += subscriber.PlayerSentMessage;
    }

这是事件触发器:

    public void SendMessage(User user, UMessage message)
    {
        try
        {
            gameChat(user, message);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

每次我.ChannelFactory.Close(); .Close();客户端关闭表单事件时,我都会收到此错误。

有没有人知道如何解决这个问题并愿意分享他的知识? 提前谢谢!

编辑#1 这是客户端打开时的代码:

    ConcurrencyMode.Multiple,
    UseSynchronizationContext = false)]
    public partial class GameForm : Form, IGameCallback
    {
    #region IGame Callbacks
    public void PlayerSentMessage(User user, UMessage message)
    {
        string nickname = user.NickName == clientUser.NickName ? "You" : user.NickName;
        this.Invoke(new MethodInvoker(() => lb_ChatBox.Items.Add(nickname + " : " + message.MessageContent)));
     }
    #endregion

    private GameClient _gameClient = null;
    private InstanceContext _instance = null;
    private User clientUser = new User(){ Email = "zigm4s@gmail.com", Id = 0, FirstName = "Zigmas", LastName = "Slusnys", NickName = "Ziggy", Password = "test123"};




    public GameForm()
    {
        string state;


        if (_gameClient != null)
        {
            MessageBox.Show("nelygu null");
            MessageBox.Show(_gameClient.State.ToString());
            //_gameClient = new GameClient(new InstanceContext(this));
        }
        else
        {

            _gameClient = new GameClient(new InstanceContext(this));
            MessageBox.Show(_gameClient.State.ToString());
        }

        InitializeComponent();

        try
        {
            _gameClient.Open();
            _gameClient.Play();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

    }

这是客户表单关闭的时候。

    private void GameForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        try {
            if (_gameClient.State != System.ServiceModel.CommunicationState.Faulted)
            {
                MessageBox.Show("Closing client");
                _gameClient.ChannelFactory.Close();
                _gameClient.Close();
            }
            else
            {
                MessageBox.Show("Aborting client");
                _gameClient.Abort();
            }
            }
        catch(Exception ex)
        { MessageBox.Show(ex.ToString());}
    }
编辑#2。编辑#2 我发现了错误,在服务方面,我的代表是静态的。当它不是静态时,它不会抛出此错误。

0 个答案:

没有答案