Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当按钮被多次单击时,如何防止应用程序挂起?_C#_Winforms - Fatal编程技术网

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

C# 当按钮被多次单击时,如何防止应用程序挂起?,c#,winforms,C#,Winforms,我有一个应用程序,用户可以点击一个扫描按钮来扫描图像,以便在应用程序中预览。当用户单击时,通常会显示一条“准备扫描”消息,当扫描100%完成时,该消息就会消失 扫描工作正常。问题是,如果我在工作时多次按下扫描按钮对其进行压力测试,应用程序就会完全挂起,消息就留在那里,我必须重新启动整个应用程序 代码:这只是一小部分 private void ScanStripButton_Click(object sender, EventArgs e) { if (SCAN_INTO_BATCH)

我有一个应用程序,用户可以点击一个扫描按钮来扫描图像,以便在应用程序中预览。当用户单击时,通常会显示一条“准备扫描”消息,当扫描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();
    }
}

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

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

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

包装为async Wait。或防止多重click@Z.R.T.你能再澄清一下吗?这正是我想要实现的。这会是一个尝试吗。谢谢,我不知道禁用按钮这么简单,启用它会有帮助。一个简单的答案通常是最好的。@TomCold在这段代码中,当StartTwainScan方法抛出异常时,按钮被禁用。你必须防止这种情况case@Enigmativity如果我的StartWain方法中已经有一个try-catch怎么办。如我编辑的帖子所示,我没有尝试你的解决方案,因为上面标记的解决方案简单得多,但谢谢你。你能详细解释第二种解决方案吗?第一种解决方案可能会遇到使用单元线程模型的Twain驱动程序的问题。第二个解决方案是多余的,因为
ScanStripButton。启用的
可以做与单击的
private bool相同的事情,但它提供了更友好的用户行为。
尝试
/
最后
也会吞下所有错误-这很糟糕。您应该只捕获特定的异常。
private void ScanStripButton_Click(object sender, EventArgs e)
{
    ScanStripButton.Enabled = false;
    if (SCAN_INTO_BATCH)
    {
        GENERATE_BATCH_FOLDER = true;
        StartTwainScan();
    }
    ScanStripButton.Enabled = true;
}