Search code examples
c#multithreadingblockingirc

blocking listen prevents disconnect


Overview of Problem:

I need to connect to an IRC Server. Once connected, the program will send a message to the channel, and a response will occur over multiple lines back. I need to read these lines and store in a variable for later use. A special character at the end of the message (]) will define the end of the message over multiple lines. Once we have received this character, the IRC session should disconnect and processing should continue.

Situation:

I am using the Smartirc4net library. Calling irc.Disconnect() takes about 40 seconds to disconnect the session. Once we've received the ] character, the session should be disconnected, Listen() should not be blocking, and the rest of the program should continue to run.

Research:

I have found this: smartirc4net listens forever, can't exit thread, and I think it might be the same issue, however, I am unsure of what I need to do to resolve the problem.

Code:

public class IrcCommunicator
    {
        public IrcClient irc = new IrcClient();

        string data;

        public string Data { get { return data; } }


        // this method we will use to analyse queries (also known as private messages)
        public void OnQueryMessage(object sender, IrcEventArgs e)
        {
            data += e.Data.Message;
            if (e.Data.Message.Contains("]"))
            {
                irc.Disconnect();  //THIS TAKES 40 SECONDS!!!

            }
        }

        public void RunCommand()
        {
            irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage);

            string[] serverlist;
            serverlist = new string[] { "127.0.0.1" };
            int port = 6667;
            string channel = "#test";

            try
            {
                irc.Connect(serverlist, port);
            }
            catch (ConnectionException e)
            {
                // something went wrong, the reason will be shown
                System.Console.WriteLine("couldn't connect! Reason: " + e.Message);
            }

            try
            {
                // here we logon and register our nickname and so on 
                irc.Login("test", "test");
                // join the channel
                irc.RfcJoin(channel);
                irc.SendMessage(SendType.Message, "test", "!query");

                // here we tell the IRC API to go into a receive mode, all events
                // will be triggered by _this_ thread (main thread in this case)
                // Listen() blocks by default, you can also use ListenOnce() if you
                // need that does one IRC operation and then returns, so you need then 
                // an own loop 

                irc.Listen();

                // when Listen() returns our IRC session is over, to be sure we call
                // disconnect manually
                irc.Disconnect();
            }
            catch (Exception e)
            {
                // this should not happen by just in case we handle it nicely
                System.Console.WriteLine("Error occurred! Message: " + e.Message);
                System.Console.WriteLine("Exception: " + e.StackTrace);
            }
        }

    }




        IrcBot bot = new IrcBot();
        bot.RunCommand();

        ViewBag.IRC = bot.Data;

As you can see, once this Thank you for your time to look at this code and read my problem description. If you have any thoughts, or other suggestions, please let me know.

Mike


Solution

  • I was able to successfully disconnect straight away by calling RfcQuit() within OnQueryMessage(), before irc.Disconnect();