2010-06-14 98 views
1

我正在构建一个应用程序,它使用扫描程序API和图像到其他格式转换器。我有一个这样做的方法(实际上是一个click事件):C#一步一步执行

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. 
    } 

的问题是,如果条件(scan_result == 1)inmediatly评估,所以它只是不工作。

如何强制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. 
    } 

它的工作原理,并显示结果。

有没有办法做到这一点,怎么样?

非常感谢!

UPDATE:

即使世界上扫描仪API的事件:

Public Event EndScan() // Occurs when the scanned the image. 

但我不知道如何使用它。任何想法?

+0

当您使用第二种方法时,消息框会正确显示结果吗? – Sev 2010-06-14 21:20:54

+0

快速链接:http://stackoverflow.com/questions/2418579/c-apm-with-callback-tutorial - 您需要查看异步编程模型。 – 2010-06-14 21:20:58

+0

我注意到你使用了“threads”标记,听起来这确实可能是一个线程问题。请解释如何使用线程? “scanner_api.Scan()”调用实际上是一个不好名称的“BeginScan”调用? – Reddog 2010-06-14 21:23:22

回答

3

这真的取决于API的工作方式。如果scanner_api.Scan()是blocking,那么它将坐在那条线等待结果。一旦得到结果,如果将评估。这可能会导致您的用户界面变得无法响应,所以您通常必须实施某种线程才能在后台执行此操作。我从你的问题猜测,这不是这个API的工作方式。

这可以工作的另一种方式是polling。你经常检查一下,看看结果是什么。您不想经常检查并耗尽所有资源(如CPU),因此您需要间隔检查。谢尔顿用计时器的答案实现了这一点。

至少有一种方法可能适用于callback。您发送API回调函数以在状态更新时进行调用。这可以实现为您绑定的事件(委托)或作为参数传递的常规委托。您经常会看到这些实现为“OnStatusChanged”,“OnCompleted”等。

基本上,这取决于API支持的内容。投票通常有效,其他投票必须得到支持。如果可能,请查看您的API文档以获取示例

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. 
     } 
    } 
} 

(这是未经测试,当然情况因人而异。)

+0

迈克尔,谢谢,请你详细说明一下这个问题吗? – Sheldon 2010-06-14 21:24:56

+0

感谢哥们:) – Sheldon 2010-06-14 21:57:46

1

您可以使用计时器(见MSDN: Timer class)定期检查扫描是否已完成与否。

您也可以使用异步呼叫,在扫描过程结束时回叫。请注意,这是更复杂的方式。