2013-05-09 2 views
0

응용 프로그램은 많은 데이터베이스 쿼리를 사용합니다. 요청은 사용자가 만든 이벤트 이후 또는 여러 타이머 (10 초 틱)를 사용하여 생성됩니다.데이터베이스에 다시 연결 시도 중

데이터베이스 서버가 갑자기 사용할 수 없게되었을 때 문제가 발생합니다. 이로 인해 연결 오류에 대한 정보가 담긴 엄청난 양의 화면 메시지가 표시됩니다.

open 호출이 실패하면 응용 프로그램이 중단되고 연결 시도가 X 초마다 (진행률 표시 줄을 포함하여) 다시 시도되는 문제를 나타내는 단일 창을 엽니 다. 연결이 복원되면 창이 닫히고 응용 프로그램이 잠금 해제됩니다.

어떻게 만드시겠습니까? 가정/지침 또는 기성 솔루션의 예를 제공해주십시오.

+0

'엄청난 양의 온 스크린 메시지'는 사용자에게 엄청난 양의 사용자가 있다는 것을 의미합니까, 아니면 WinForms 앱에 표시 할 코드가 있음을 의미합니까? 사용자에게 많은 오류 메시지가 나타 납니까? –

+0

화면에 오류 메시지가 나타나기 전에 일반적인 SQL 연결 시간 초과 (30 초?)가 있다고 가정합니까? –

+0

가장 먼저 떠오르는 것은 단추를 사용하지 않고 모달 대화 상자를 열어 재시도 작업을 닫고 다시 시작하는 것입니다. 그러나 모든 것을 기각하고 응용 프로그램을 닫을 수있는 방법을 제공 할 것입니다 (특정 임계 값에 도달하면 사용자가 포기할 수있는 재시도 카운터) – Steve

답변

0

내가 올바르게 이해한다면 유용성 문제입니다. 귀하의 목표는 귀하의 사용자가 행복을 누리는 것입니다. & db 연결을 기다리는 동안 모든 것이 잘되었다고 확신합니다. 당신은 원하지 않습니다 : 당황한 사용자가 임의 버튼을 누르고, 도움을 청하고 불평을합니다. 의미없는 기술적 오류 메시지가 쌓이는 것을 원하지 않습니다. 메시지가없는 고정 앱도 없습니다. 그러나 좋은 유익한 메시지와 함께 일시적으로 고정 된 앱을 수락 할 것입니다.

좋은 사용성은 저렴하지 않습니다. 사용자가 취소 할 수있게하려면 몇 가지 멀티 스레딩을 알아야합니다. 이를 위해 저는 여기에서 시작하겠습니다 : http://msdn.microsoft.com/en-us/library/ms951089.aspx. '잠시만 기다려주십시오. 데이터베이스 연결에 최대 xxx 초가 걸릴 수 있습니다.'라는 정적 메시지에 만족하면이 문제를 피할 수 있습니다.

WinForms 앱이 많은 곳에서 데이터베이스를 호출하지만, 다시 작성하는 데 걸리는 시간이 필요하지는 않습니다.

제가 생각할 수있는 가장 단순한 단일 스레드 솔루션은 DoWaitForm 및 '래퍼'메서드를 정의하는 것입니다. 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"; 
    } 
} 
}