简体   繁体   中英

Constant running process on a sperate thread blocking a UI thread

i am trying to use a third party telnet library "active expert" for a basic telnet session. in my UI code behind i have something like

private async void Button_Click(object sender, RoutedEventArgs e)
    {           
        var ts = new TelnetService();
        await ts.DoConnect(node);
    }

and my TelnetService looks like this

    public class TelnetService
{
    private Tcp objSocket = new Tcp();
    private NwConstants objConstants = new NwConstants();
    public string Responses { get; set; }
    private Timer timer1 = new Timer();

    public TelnetService()
    {
        timer1.Elapsed += timer1_Elapsed;
        timer1.Interval = 100;
        timer1.Start();
    }
    void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        if (objSocket.ConnectionState == objConstants.nwSOCKET_CONNSTATE_CONNECTED)
        {
            if (objSocket.HasData())
            {
                Responses += objSocket.ReceiveString() + "\r\n";
            }
        }
    }

    public Task DoConnect(Node node)
    {
        return Task.Factory.StartNew(() =>
       {
           objSocket.Protocol = objConstants.nwSOCKET_PROTOCOL_TELNET;
           objSocket.Connect(node.IP, 23);

           while (true)
           {
               if ((Responses == null) || (!Responses.Contains(node.WaitString))) continue;
               //do something
               Responses = "";
               break;
           }
       });
    }

}

there are two important pieces of functionalities.

First in the timer1_Elapsed function which is process that will keeps on ruining and checks if there is data on socket, and if there is, it will append it to a string "Response". and i am using "timer" for it.

Second in the DoConnect function which will check the"Response" string for a certain input. for this i am using async await and Task.

in a nutshell first one accumulating the Response and Second one checking the Response.

Problem is that it looks like the timer code in general and

objSocket.ReceiveString()

line specifically is causing the UI thread to halt for several seconds. which means after clicking the button i cannot move my main form on the screen however the code is running in a separate thread. i have tried using pure Thread for this but it didn't helped either.

update

instead of timer i am using a method AccumulateResponse

public static void AccumulateResponse()
    {
        while (true)
        {
            if (objSocket.ConnectionState == objConstants.nwSOCKET_CONNSTATE_CONNECTED)
            {
                if (objSocket.HasData())
                {
                    Responses += objSocket.ReceiveString() + "\r\n";
                }
            }
        }

    }

and calling it like

   var t = new Task(TelnetService.AccumulateResponse);           
        t.Start();
        await TelnetService.DoConnect(node);

still no luck

The DoConnect isn't your problem. It is your Timer Elapsed Event handler.

The timer elapsed event is NOT asynchronous. Only the DoConnect is.

If there is no asynchronous version of ReceiveString() from your third party lib, then use Task.Run there as well inside of an async timer1_elapsed method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM