대화 상자를 사용하는 것이 가장 좋으며 나머지 UI에 자동으로 액세스 할 수 없게합니다. 새 폼을 프로젝트에 추가하고 ProgressBar와 Button을 드롭합니다. 당신이 당신의 기본 폼에 이벤트 핸들러에서 진행 표시 줄을 업데이트 할 수 있도록 공용 메서드를 추가
public partial class ProgressDialog : Form {
public ProgressDialog() {
InitializeComponent();
}
public void ShowProgress(int progress) {
progressBar1.Value = progress;
}
private void CancelProcess_Click(object sender, EventArgs e) {
this.DialogResult = DialogResult.Cancel;
}
}
당신이 노동자 시작할 때이 대화 상자를 표시해야합니다 :
ProgressDialog dlg;
private void RunProcess_Click(object sender, EventArgs e) {
backgroundWorker1.RunWorkerAsync();
using (dlg = new ProgressDialog()) {
dlg.ShowDialog(this);
}
dlg = null;
if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();
}
주 작업자를 중지시키기 위해 CancelAsync()를 호출하는 방법으로 대화 상자를 닫으면 멈출 수 있습니다. 당신은 진행률 표시 줄을 업데이트해야합니다
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
dlg.ShowProgress(e.ProgressPercentage);
}
을 그리고 당신은 노동자가 완료되면 자동으로 대화 상자를 닫습니다 필요하고 사용자가 대화 상자 자신 닫지했습니다
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (dlg != null) dlg.Close();
}
내가 쓴해야 해당 특수 프로세스의 코드는 "if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();"줄에 썼습니다. 그 프로세스를 실행 한 후 새 양식이 사용 가능으로 표시되고 아무것도 표시되지 않았습니다.이 문제점을 어떻게 해결할 수 있습니까? –
백그라운드 작업자를위한 DoWork() 이벤트 처리기에이 이벤트를 씁니다. –
그 문제는 해결되었지만 다른 하나는 발생합니다.이 과정에서 폼에있는 일부 컨트롤에 액세스해야합니다. 예를 들어 opB라는 버튼을 사용하지 않도록 설정하면 프로젝트를 실행하면 콜트 롤에 오류가 발생합니다. 예를 들어 이 오류 : "크로스 스레드 작업이 유효하지 않습니다 : 'opB'가 생성 된 스레드 이외의 스레드에서 액세스 제어하십시오." 지금 어떻게해야합니까? –