阻塞UI线程的sperate线程上的持续运行进程

时间:2015-12-29 16:12:45

标签: c# multithreading async-await task-parallel-library

我正在尝试使用第三方telnet库"活跃专家"用于基本的telnet会话。 在我的UI代码后面我有类似

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

我的TelnetService看起来像这样

    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;
           }
       });
    }

}

有两个重要的功能。

首先在 timer1_Elapsed 函数中,该函数将继续破坏并检查套接字上是否有数据,如果有,则会将其附加到字符串"响应&# 34 ;.我正在使用"计时器"为了它。

DoConnect 功能中的第二个功能,它将检查"响应"某个输入的字符串。为此我使用async await和Task。

简而言之,第一个累积响应,第二个检查响应。

问题在于它看起来像一般的计时器代码和

objSocket.ReceiveString()

行专门导致UI线程暂停几秒钟。这意味着在单击按钮后,我无法在屏幕上移动我的主窗体,但代码在单独的线程中运行。 我曾尝试过使用纯线程,但它也没有帮助。

更新

而不是计时器我使用的方法是AccumulateResponse

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

    }

并将其称为

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

仍然没有运气

1 个答案:

答案 0 :(得分:0)

DoConnect不是你的问题。这是你的Timer Elapsed Event处理程序。

计时器已用事件不是异步的。只有DoConnect

如果您的第三方lib中没有ReceiveString()的异步版本,那么在Task.Run方法中也使用async timer1_elapsed