비동기 처리...를 간단히!!!
프로그램을 만들때 비동기로 처리하고 싶다거나
프로그래스 바로 진행율같은걸 표시하고 싶을때나...
사용하면 엄청 편하게 사용이 가능하다.
task나 await 같은 비동기... 처리도 있지만... ( 머리가 나쁘니 이해하는데 오래 걸리긴 한데... )
## 소스 사용예제
// todo : Excel Export
AsyncManagerClass async = new AsyncManagerClass();
async.BeforeAsyncCall = () => {
button1.DoInvoke(b => b.Enabled = false); <-- 크로스 쓰레드를 회피! 하는 Invoke!
progressBar1.DoInvoke(p =>
{
p.Minimum = 0;
p.Maximum = src.Rows.Count -1;
});
};
async.AfterAsyncCall = () => {
button1.DoInvoke(b => b.Enabled = true);
};
async.Async(() => {
ExportToExcel(src); <--- 비동기로 뭔가 열심히 처리 할수 있는 Method!
});
async.Async 내에서 호출되는 컨트롤들은 모두
.DoInvoke( c => ... ); 로 묶어서 처리 해주면 된다.
private void ExportToExcel(DataTable src)
{
... 생략 ...
try
{
for (int row = 0; row < src.Rows.Count; row++)
{
progressBar1.DoInvoke( p => p.Value = row );
... 생략 ...
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
#region 비동기 처리
public class AsyncManagerClass
{
public Action BeforeAsyncCall = null;
public Action AfterAsyncCall = null;
public void Async(Action doActionMethod)
{
if (BeforeAsyncCall != null)
BeforeAsyncCall();
IsRun = true;
if (doActionMethod != null)
{
doActionMethod.BeginInvoke(ir =>
{
try
{
doActionMethod.EndInvoke(ir);
if (AfterAsyncCall != null)
{
AfterAsyncCall();
}
}
catch
{
// 작업 중!! 예외
}
IsRun = false;
}, null);
}
}
public void Stop()
{
IsRun = false;
}
public bool IsRun { get; set; }
}
public static class Ex
{
public static void DoInvoke<T>(this T ctrl, Action<T> callMethod) where T : Control
{
if (ctrl.InvokeRequired)
{
ctrl.Invoke(new Action<T, Action<T>>(DoInvoke), ctrl, callMethod);
}
else
{
callMethod(ctrl);
}
}
}
#endregion
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
친구에게 만들어준 프로그램! 작업자 이력관리. (0) | 2016.11.08 |
---|---|
Sqler 에 올라온 질문 글... (0) | 2016.10.21 |
데이타 테이블정의서 Excel 생성하기. (0) | 2016.10.18 |
로또 체크기...? (0) | 2016.10.18 |
Class를 XML변환, XML을 Class변환 (0) | 2016.09.12 |