多次单击按钮时,如何防止应用程序挂起?

时间:2018-10-08 03:41:54

标签: c# winforms

我有一个应用程序,用户可以单击“扫描”按钮来扫描图像以在应用程序中预览。当用户单击时,通常会显示“正在准备扫描”消息,并且在扫描完成100%后消失。

扫描正常。问题是如果我在工作时多次按扫描按钮来进行压力测试,则应用程序将完全挂起,并且消息仅停留在该位置,因此我必须重新启动整个应用程序。

代码:这只是一小部分

private void ScanStripButton_Click(object sender, EventArgs e)
{
    if (SCAN_INTO_BATCH)
    {
        GENERATE_BATCH_FOLDER = true;
        StartTwainScan();
    }
}

关于如何预防此问题的任何想法? 感谢帮助

编辑:

public void StartTwainScan()
{
    Boolean EnableUI = false;
    Boolean ADF = false;
    Boolean EnableDuplex = false;

    if (Properties.Settings.Default.TwainShow.Equals("1"))
    {
        EnableUI = true;
    }

    if (Properties.Settings.Default.ScanType.Equals("2"))
    {
        ADF = true;
    }

    if (Properties.Settings.Default.DuplexEnable.Equals("1"))
    {
        EnableDuplex = true;
    }

    var rs = new ResolutionSettings
    {
        Dpi = GetResolution(),
        ColourSetting = GetColorType()
    };

    var pg = new PageSettings()
    {
        Size = GetPageSize()
    };


    var settings = new ScanSettings
    {
        UseDocumentFeeder = ADF,
        ShowTwainUI = EnableUI,
        ShowProgressIndicatorUI = true,
        UseDuplex = EnableDuplex,
        Resolution = rs,
        Page = pg
    };

    try
    {
        TwainHandler.StartScanning(settings);
    }
    catch (TwainException ex)
    {
        MessageBox.Show(ex.Message);
        //Enabled = true;
        //BringToFront();
    }
}

2 个答案:

答案 0 :(得分:4)

这将不是正确的答案,但是您没有显示足够的代码来提供正确的代码。它应该为您指明正确的方向。

private void ScanStripButton_Click(object sender, EventArgs e)
{
    ScanStripButton.Enabled = false;
    if (SCAN_INTO_BATCH)
    {
        GENERATE_BATCH_FOLDER = true;
        StartTwainScan();
    }
    ScanStripButton.Enabled = true;
}

基本上,您在扫描开始时禁用该按钮,并在扫描结束时启用它。

答案 1 :(得分:2)

private async void ScanStripButton_Click(object sender, EventArgs e)
{
    await Task.Run(() =>
    {
        if (SCAN_INTO_BATCH)
        {
            GENERATE_BATCH_FOLDER = true;
            StartTwainScan();
        }
    });
}

or 

private bool clicked = false;
private void ScanStripButton_Click(object sender, EventArgs e)
{
    try
    {
        if(clicked)
            return;

        clicked = true;
        if (SCAN_INTO_BATCH)
        {
            GENERATE_BATCH_FOLDER = true;
            StartTwainScan();
        }
    }
    finally
    {
        clicked = false;
    }
}