我正在构建一个使用和扫描API以及图像到其他格式转换器的应用程序。我有一个方法(实际上是一个点击事件)来执行此操作:
private void ButtonScanAndParse_Click(object sender, EventArgs e)
{
short scan_result = scanner_api.Scan();
if (scan_result == 1)
parse_api.Parse(); // This will check for a saved image the scanner_api stores on disk, and then convert it.
}
问题在于if条件(scan_result == 1)是中等评估的,所以它只是不起作用。
如何强制CLR等到API返回方便的结果。
请注意
只需做类似的事情:
private void ButtonScanAndParse_Click(object sender, EventArgs e)
{
short scan_result = scanner_api.Scan();
MessageBox.Show("Result = " + scan_result);
if (scan_result == 1)
parse_api.Parse(); // This will check for a saved image the scanner_api stores on disk, and then convert it.
}
它可以工作并显示结果。
有办法做到这一点,怎么做?
非常感谢!
更新:
有关扫描仪API的事件:
Public Event EndScan() // Occurs when the scanned the image.
但我不知道如何使用它。有什么想法吗?
答案 0 :(得分:3)
这实际上取决于API的工作原理。如果scanner_api.Scan()为blocking,则它将位于该行等待结果。一旦得到结果,if将评估。这可能会导致您的UI无响应,因此您通常必须实现某种线程才能在后台执行此操作。我猜你的问题不是这个API的工作方式。
另一种可行的方法是使用polling。您经常检查以查看结果。您不想经常检查并耗尽所有资源(例如CPU),因此您需要每隔一段时间检查一次。谢尔顿用计时器回答了这个问题。
至少还有一种方法可以使用callback。您向API发送一个回调函数,以便在状态更新时进行调用。这可以作为您绑定的事件(委托)或作为参数传递的常规委托来实现。您经常会看到这些实现为“OnStatusChanged”,“OnCompleted”等。
基本上,它取决于API支持的内容。轮询通常有效,其他人必须得到支持。如果可能,请查看您的API文档以获取示例。
答案 1 :(得分:1)
一种方法是使用计时器。将计时器设置为每隔几秒检查一次,以检查scan_result中的值(需要将其提升为类级变量才能使其生效)。
所以,比如:
public class Scanning
{
private System.Timers.Timer aTimer;
short scan_result;
public Scanning()
{
aTimer = new System.Timers.Timer(1000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
private void ButtonScanAndParse_Click(object sender, EventArgs e)
{
aTimer.Enabled = true;
scan_result = scanner_api.Scan();
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
if (scan_result == 1)
{
aTimer.Enabled = false;
parse_api.Parse(); // This will check for a saved image the scanner_api stores on disk, and then convert it.
}
}
}
(当然,这是未经测试的.YMMV。)
答案 2 :(得分:1)
您可以使用计时器(请参阅MSDN: Timer class)定期检查扫描是否已经完成。
您也可以使用在扫描过程完成时回调的异步调用。请注意,这是更复杂的方式。