如何在线程/后台任务上执行长任务(即图像扫描)?



我正在使用 EMC Captiva PixTools API 开发一个图像扫描应用程序。 API 建议一个简单的长时间运行的循环,以便在扫描时接收图像,但这会阻止 UI 线程。

例:

while(true)
{
Image newImage = Scanner.GetNextImage(); // blocks until image is received
}

我想保证它在单独的线程(而不是 UI 线程)上执行并继续运行,直到用户取消它。 我还需要将 newImage 对象返回到主线程,以便将其添加到 UI 中。

在 Windows 窗体应用程序中,我会使用 BackgroundWorker,但此代码是从 .NET 库运行的(然后加载到 Windows 窗体应用程序中)。

我一直在尝试了解异步/等待模式,但我不确定这是否保证在单独的线程上运行任何东西?

关于解决此问题的最佳实践的任何建议?

您是正确的,async/await 不保证线程。不过,Task.Run() 确实如此。从这个开始:

await Task.Run(
() =>
{
while(true)
{
Image newImage = Scanner.GetNextImage();
// ImageReceived(newImage); ?
}
}
);

或。。。

while (true)
{
Image newImage = await Task.Run(
() =>
{
return Scanner.GetNextImage();
}
}
}

最新更新