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

本文关键字:线程 运行 进程 sperate UI | 更新日期: 2023-09-27 18:28:27

我正在尝试使用第三方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函数中,该函数是一个将继续破坏并检查套接字上是否有数据的进程,如果有,它将把数据附加到字符串"Response"中。我用"定时器"。

第二个是DoConnect函数,该函数将检查特定输入的"响应"字符串。为此,我使用异步等待和任务。

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

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

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

仍然没有运气

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

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

计时器运行时间事件不是异步的。只有DoConnect是.

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