gpt4 book ai didi

c# - 使用程序集引用 dll 的某些方法时用户界面停止

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:53 24 4
gpt4 key购买 nike

我在 C# 中使用程序集引用 dll 来控制一些网络设备!当我尝试连接网络设备时,用户界面停止直到连接建立!为了解决这个问题,我确实使用了threads/async-await (.Net Framework 4.0) 但问题仍然没有解决......

这是我的代码(使用线程):

    public void startListening(string IP, string Port)
{
if (!ThreadBusy)
{
if (IP.Trim() == "" || Port.Trim() == "") return;
Conn = new Thread(() => start(IP, Port));
Conn.Start();
ThreadBusy = true;
}
}

private void start(string IP, string Port)
{
if (!bIsConnected && !isListening)
{
//This Line Will Make UI Freez...
bIsConnected = axCZKEM1.Connect_Net(IP, Convert.ToInt32(Port));
if (bIsConnected == true)
{
iMachineNumber = 1;
deviceType = axCZKEM1.IsTFTMachine(iMachineNumber) ? 1 : 2;
this.IP = IP;
this.isListening = true;
if (axCZKEM1.RegEvent(iMachineNumber, 65535))
{
switch (deviceType)
{
case 1:
EnableTFTEvents();
break;
case 2:
EnableBWEvents();
break;
case 3:
//---
break;
}
ConnectionFailedArgs args = new ConnectionFailedArgs();
args.IP = IP;
OnConnectionSucceed(args);
}
}
else
{
ConnectionFailedArgs args = new ConnectionFailedArgs();
args.IP = IP;
OnConnectionFailed(args);
}
ThreadBusy = false;
}
}

我想知道使用此线程时 UI 上发生了什么?

我将我的 VS 从 2010 升级到 2012(.Net Framework 4.5),但问题仍然没有解决!

这是我的代码(使用异步等待):

        public async void startListening(string IP, string Port)
{
if (!ThreadBusy)
{
if (IP.Trim() == "" || Port.Trim() == "") return;

//Conn = new Thread(() => start(IP, Port));
//Conn.Start();
ThreadBusy = true;
await Task.Run(() => start(IP,Port));
}
}

private async Task start(string IP, string Port)
{
if (!bIsConnected && !isListening)
{
//This Line Will Make UI Freez...
bIsConnected = axCZKEM1.Connect_Net(IP, Convert.ToInt32(Port));
if (bIsConnected == true)
{
deviceType = axCZKEM1.IsTFTMachine(iMachineNumber) ? 1 : 2;
this.IP = IP;
this.isListening = true;
if (axCZKEM1.RegEvent(iMachineNumber, 65535))
switch (deviceType)
{
case 1:
EnableTFTEvents();
break;
case 2:
EnableBWEvents();
break;
case 3:
//---
break;
}
ConnectionFailedArgs args = new ConnectionFailedArgs();
args.IP = IP;
OnConnectionSucceed(args);
}
}
else
{
ConnectionFailedArgs args = new ConnectionFailedArgs();
args.IP = IP;
OnConnectionFailed(args);
}
ThreadBusy = false;
}
}

最佳答案

async/await 以某种方式使代码创建线程或由它们自己异步执行是一种常见的误解。他们不。它们实际上指示编译器执行您在另一个线程上调用 await 的任何异步方法,并在异步方法完成时在原始线程上返回执行。它是实际创建和调度任务并(间接)使用线程的异步方法。

您必须在异步操作上调用await,否则您的整个方法将在原始(即UI)线程中执行。

这意味着当您调用 Connect_Net 时,您仍然在 UI 线程上并且您的应用程序将显示为卡住。

您应该查看 Stephen Toub 的文章“Invoke the method with await ... ugh!”以获得更详细的解释。

最好的解决方案是使用异步版本的 Connect_Net,如果有的话,然后 await 在上面,例如。

private async Task start(string IP, string Port)
{
if (!bIsConnected && !isListening)
{
//This Line Will Make UI Freez...
bIsConnected = await axCZKEM1.Connect_NetAsync(IP, Convert.ToInt32(Port));
...

如果没有这样的方法,可以使用Task.Run异步调用Connect_Net

private async Task start(string IP, string Port)
{
if (!bIsConnected && !isListening)
{
//This Line Will Make UI Freez...
bIsConnected = await Task.Run(()=>axCZKEM1.Connect_Net(IP, Convert.ToInt32(Port)));

...

await 之后,在原始 SynchronizationContext 上继续执行(大致是桌面应用程序的原始线程)。这意味着如果其余代码需要很长时间才能运行,UI 仍然会卡住。

关于c# - 使用程序集引用 dll 的某些方法时用户界面停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18101100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com