gpt4 book ai didi

c# - 阻塞调用但不阻塞线程

转载 作者:太空狗 更新时间:2023-10-29 22:59:49 25 4
gpt4 key购买 nike

最近我遇到了一个专有的第三方库,有一种方法是这样的:

public Point ClickOnDrawMat(DrawMat drwmat)  
{
Point pt;
//waiting user mouse click on DrawMat and assign to pt
return pt;
}

当我的代码从主线程调用这个方法时,它会阻塞这个方法直到用户点击,然后从 ClickOnDrawMat 获取点返回。

public void button1_Click(object sender, EventArgs e)
{
Point userClickedPoint = ClickOnDrawMat(oDrwMat); //Wait until user clicked
//Do stuff with point we got
}

但是,它不会阻塞主线程。当它仍在等待用户点击时,我仍然可以按下其他按钮/UI 控件。
我注意到在等待用户点击时,其中一个 CPU 核心的使用率似乎相当高 (~75%)。

这是我在等待用户点击时点击另一个按钮后调用堆栈的示例:

myProgram.frmMain.button2_Click(xxx) Line 23
[External Code]
ThirdPartyLib.ClickOnDrawMat(xxx) Line 16
myProgram.frmMain.button1_Click(xxx) Line 14

我想知道如何做到这一点?
提前致谢!

最佳答案

我们无法确切地告诉您它是如何完成的,除非有人拥有库的副本并且他们使用反编译器来查看代码在做什么(如果您想自己做 dotPeek 是免费且容易的利用)。

但是根据您描述其行为的方式,它可能会重复调用 Application.DoEvents()在函数内部,这将让其他消息在长时间运行的进程执行它的过程中得到处理。

这几乎从来不是轮询操作的良好编码实践,因为它的 CPU 成本很高,正如您所注意到的,我建议不要在您自己的代码中这样做。

处理此问题的“正确”方法是使用 Asynchronous Programming Patterns 之一: async/await feature在 .NET 4.5 中添加或作为 NuGet package for 4.0 添加( TAP ),让库引发自己的事件 ( EAP ),或者让函数在完成时使用回调函数 ( APM )。在函数本身内部,它应该在内部使用事件驱动系统,以便它在等待事件发生而不是轮询时不使用 CPU 资源。

关于c# - 阻塞调用但不阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18638896/

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