.NET4를 사용하여 C#, 나는 winform에 그리드가 있습니다. 프로세스 버튼을 누르면 각 행에서 몇 단계 만 수행하여 적시에 작업을 수행 한 다음 결과로 행을 업데이트해야합니다. 이렇게하면 다음 행이 처리되는 동안 사용자가 진행률을 볼 수 있습니다. 사용자가 취소하거나 양식을 닫을 경우 현재 행의 프로세스를 완료 한 다음 양식을 중단하거나 닫아야합니다. 내 연구를 바탕으로, 여기에 내가 생각해 낸 것입니다. 2 문제가 남아 있습니다. 양식을 닫기 전에 스레드를 중지하십시오.
delegate void OperateGridMethodDelegate();
delegate void UpdateProgressDelegate(int rowIndex, string msg);
bool isCancelled = false;
private void ButtonOne_Click(object sender, EventArgs e)
{
isCancelled=false;
OperateGridMethodDelegate delegate = new OperateGridMethodDelegate(LongProcess);`
delegate.BeginInvoke(null,null);
}
private void ButtonTow_Click(object sender, EventArgs e)
{
MyButtonOne.Enabled=false;
isCancelled=true;
}
private void LongProcess()
{
foreach (DataRow row in dataTableOne.Rows)
{
//Do Lengthy Process
DisplayResult(rowIndex, "this is result of operation");
if(isCancelled)
{
MyButtonOne.Enabled=true;
break;
}
}
}
private void DisplayResult(int rowIndex,string message)
{
if(myGrid.InvokeRequired == false)
{
myGrid.Rows[rowIndex].value = message;
}
else
{
UpdateProgressDelegate delegate = new UpdateProgressDelegate(DisplayResult);
myGrid.BeginInvoke(delegate, new object[] { rowIndex, message });
}
}
내가 왼쪽하고있어이 문제
은 다음과 같습니다 : 양식이 폐쇄되면, 나는 (그에 의해 호출 된 LongProcess 기다려야 할 다음
내 코드입니다 내 OperateGridMethodDelegate) 최대 행을 마친 후 취소 (같은 방법으로 내가 ButtonTwo 함께),하지만이 작동하도록 가져올 수 없습니다.디버깅 할 때 이상한 동작을 발견하고이 버그가 맞는지 또는 처리가 완료 될 때 결과가 설정되지 않았는지 확실하지 않습니다. 대신 다음 행이 처리 된 다음 이전 행 결과가 표시됩니다. 세 번째 행이 완료되면 두 번째 행 결과가 표시됩니다. 그런 다음 마지막 두 행 결과는 기본적으로 동시에 표시됩니다.
정확하게 접근하고 있습니까? 당신이 당신이 할 수있는 진행하기 전에 끝날 때까지 기다려야하는 스레드에서 일부 작업을 시작했다면
대리자의 BeginInvoke() 메서드를 사용하여 스레딩을 구현하지 마십시오. * bool *은 동기화 프리미티브가 아닙니다. 이 작업을 수행하는 더 좋은 방법이 있습니다.이 작업을 BackgroundWorker에 올바르게 처리하는 방법은 [this Q + A] (http://stackoverflow.com/a/1732361/17034)에서 다룹니다. –