在阻塞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);
仍然没有运气
DoConnect
不是你的问题。它是您的Timer Elapsed Event处理程序。
计时器运行时间事件不是异步的。只有DoConnect
是.
如果您的第三方库中没有ReceiveString()
的异步版本,那么也可以在async timer1_elapsed
方法中使用Task.Run
。