내가 올바르게 이해한다면 유용성 문제입니다. 귀하의 목표는 귀하의 사용자가 행복을 누리는 것입니다. & 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";
}
}
}
'엄청난 양의 온 스크린 메시지'는 사용자에게 엄청난 양의 사용자가 있다는 것을 의미합니까, 아니면 WinForms 앱에 표시 할 코드가 있음을 의미합니까? 사용자에게 많은 오류 메시지가 나타 납니까? –
화면에 오류 메시지가 나타나기 전에 일반적인 SQL 연결 시간 초과 (30 초?)가 있다고 가정합니까? –
가장 먼저 떠오르는 것은 단추를 사용하지 않고 모달 대화 상자를 열어 재시도 작업을 닫고 다시 시작하는 것입니다. 그러나 모든 것을 기각하고 응용 프로그램을 닫을 수있는 방법을 제공 할 것입니다 (특정 임계 값에 도달하면 사용자가 포기할 수있는 재시도 카운터) – Steve