으로 프로세스를 구현하는 동안 구현을 중지하는 방법입니다. 따라서이 코드는 임의의 시작 번호로 증가 된 값의 스트림 값을 사용합니다. start1 값이 커지고 start2보다 크면 텍스트 상자가있는 해당 줄을 표시하고 다른 줄을 표시하려고합니다.backgroundWorker
문제 주어진주기 수가 만족 될 때까지 프로그램을 멈출 수 없습니다. 주입 중에 버튼이 멈 춥니 다. 나는 이것이 일어나는 이유가 반복적이라는 것을 이해한다. 이제 backgroundWorker로 중지하려고하지만 같은 결과가 나타나면 취소 단추가 같은 방법으로 중지됩니다.
backgroundWorker1_ProgressChanged 내에 위치한 backgroundWorker와 함께 사용하려는 코드. 나는 여기서 무슨 일이 일어나고 있는지 정말로 이해하지 못한다. 어쩌면 당신은 내가 잘못 뭘하는지 파악하는 데 도움이 :
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace XX_8_0
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void startAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.RunWorkerAsync();
}
}
private void cancelAsyncButton_Click(object sender, EventArgs e)
{
if (backgroundWorker1.WorkerSupportsCancellation == true)
{
backgroundWorker1.CancelAsync();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var random = new Random();
var start1 = random.Next(0, 100);
var start2 = random.Next(0, 100);
var incrementor1 = start1 > 50 ? -1 : 1;
var incrementor2 = start2 > 50 ? -1 : 1;
var cV1 = start1;
var cV2 = start2;
for (var i = 0; i < 1000; i++)
{
if (cV1 == 101) incrementor1 = -1;
if (cV1 == 0) incrementor1 = 1;
if (cV2 == 101) incrementor2 = -1;
if (cV2 == 0) incrementor2 = 1;
if (cV1 > cV2)
{
textBox1.AppendText("ID: (" + i + ") CV1: (1): [" + cV1 + "] CV2: (0) [" + cV2 + "]\n");
}
else
{
textBox1.AppendText("ID: (" + i + ") CV1: (0): [" + cV1 + "] CV2: (1) [" + cV2 + "]\n");
}
cV1 += incrementor1;
cV2 += incrementor2;
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
resultLabel.Text = "Canceled!";
}
else if (e.Error != null)
{
resultLabel.Text = "Error: " + e.Error.Message;
}
else
{
resultLabel.Text = "Done!";
}
}
}
}
내 대답 외에도 ** 관련 ** 섹션에서 유용한 정보를 얻을 수 있습니다. 분명히 위의 구현은 매우 좋지 않으며'BackgroundWorker'가 어떻게 작동하는지 잘 이해하지 못하고 있습니다. – Phil1970