C#逐步执行

时间:2010-06-14 21:18:49

标签: c# multithreading clr execution

我正在构建一个使用和扫描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.

但我不知道如何使用它。有什么想法吗?

3 个答案:

答案 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)定期检查扫描是否已经完成。

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