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