2013-05-09 182 views
0

的应用需要大量的数据库查询。请求是在用户做出的事件之后或通过使用多个定时器(10秒钟)创建的。尝试重新连接到数据库

当数据库服务器突然变得不可用时,会发生该问题。这会导致包含有关连接中错误信息的大量屏幕消息。

我想实现一个失败的公开呼叫会冻结应用程序并打开一个窗口,指出连接尝试将每X秒重试一次(加上进度条)的问题。如果连接恢复,则窗口关闭,应用程序将解锁。

怎么办?请提供假设/准则或现成解决方案的例子。

+0

当你说,“巨大的屏幕上的信息的数量”你的意思是你有一个庞大的用户量还是你的意思是,你的WinForms应用程序有代码,它显示许多错误消息给用户? – 2013-05-09 08:16:04

+0

我认为有正常的SQL连接超时(30秒?)你在屏幕上的错误信息之前? – 2013-05-09 08:18:05

+0

,想到的第一件事就是打开一个模式对话框无按键关闭和启动重试工作。不过,我会提供一种方法来关闭所有内容并关闭应用程序(当达到某个阈值时允许用户放弃重试的计数器) – Steve 2013-05-09 08:21:29

回答

0

所以,如果我理解你的权利,这是一个可用性问题。你的目标是你的用户是快乐&信心,一切都很好,而等待一个数据库连接。你不想要:恐慌的用户按下任意按钮,打电话寻求帮助和抱怨。您不需要加载无意义的技术错误消息;也不是没有消息的冷冻应用程序。但是,您会接受一个临时冻结的应用,并提供一条有用的信息。

良好的实用性并不便宜。如果你想让用户取消,那么你必须学习一些多线程。为此,我从这里开始:http://msdn.microsoft.com/en-us/library/ms951089.aspx。如果您对静态消息表示“请稍候,数据库连接可能需要长达xxx秒...”才能避免此情况。

我大胆地猜测你的WinForms应用程序从很多地方调用数据库,但是你想要一些不需要几天重写的东西。

我能想到的最简单的单线程解决方案是定义一个PleaseWaitForm和一个'wrapper'方法,我将其称为DoWithPleaseWait(),它将围绕所有业务逻辑/数据访问调用,显示和隐藏请稍候形式:

namespace WinFormsPleaseWaitExample 
{ 
//You don't need these 2 lines if you have .Net 3 or later 
public delegate void Action(); 
public delegate TResult Func<TResult>(); 
// 

public partial class Form1 : Form 
{ 
    private readonly Form pleaseWaitForm; 
    public Form1() 
    { 
     InitializeComponent(); 
     pleaseWaitForm = new PleaseWaitForm {Owner = this}; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var result= DoWithPleaseWait(delegate { return SomeBusinessLayerClass.ADataRetrieval("boo"); }); 
     MessageBox.Show(result.ToString()); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     DoWithPleaseWait(delegate { SomeBusinessLayerClass.ADataOperation("boo"); }); 
    } 

    public void DoWithPleaseWait(Action action) 
    { 
     pleaseWaitForm.Show(); 
     action.DynamicInvoke(); 
     pleaseWaitForm.Hide(); 
    } 

    public TResult DoWithPleaseWait<TResult>(Func<TResult> func) 
    { 
     pleaseWaitForm.Show(); 
     TResult result = (TResult)func.DynamicInvoke(); 
     pleaseWaitForm.Hide(); 
     return result; 
    } 
} 

public class SomeBusinessLayerClass 
{ 
    public static void ADataOperation(string someInput) 
    { 
     //Do something that might take several seconds... 
     Thread.Sleep(3000); 
    } 
    public static object ADataRetrieval(string someInput) 
    { 
     //Do something that might take several seconds... 
     Thread.Sleep(3000); 
     return someInput + " returned"; 
    } 
} 
} 
相关问题