0

ここでは、C# で単純なロジックを使用しています。2 つの から日を引いて、合計日数DateTimePickerと同じ数の行を生成しています。GridViewこのロジックを に入れTimer、100 ミリ秒間隔で刻み、自動的に実行します。これは 90 ~ 100 行では問題なく動作しますが、1000 行になるとプログラムが動かなくなります。だから、私はスレッドを使用する必要があると考えています。これどうやってするの?私は基本的なマルチスレッドを知っていて、これを試しましたが、うまくいきませんでした:

private void timer1_Tick(object sender, EventArgs e)
{
    myMethod();
}

void myMethod() {
    ed_Picker.MinDate = sd_Picker.Value;
    TimeSpan ts = new TimeSpan();

    //GridView.Rows.cont

    label3.Text = ed_Picker.Value.CompareTo(sd_Picker.Value).ToString();
    //dateTimePicker2.MinDate = dateTimePicker1.Value;

    ts = ed_Picker.Value.Subtract(sd_Picker.Value);
    double d;

    d = Math.Ceiling(ts.TotalDays) + 1;
    label3.Text = d.ToString();
    DataGridViewRow row = new DataGridViewRow();


    GridView.RowCount = Int32.Parse(d.ToString()); // This is key line which I like to put in new Thread
    for (int i = 1; i <= GridView.RowCount; i++)
    {
        GridView.Rows[i - 1].Cells[0].Value = sd_Picker.Value.AddDays(Convert.ToDouble(i - 1)).ToLongDateString();
        GridView.Rows[i - 1].Cells[0].ReadOnly = true;
    }
    DateTimeConverter dtc = new DateTimeConverter();
    TimeSpan ts1 = new TimeSpan();

    try
    {
        for (int i = 0; i < GridView.RowCount; i++)
        {
            ts1 += Convert.ToDateTime(GridView.Rows[i].Cells[2].Value).Subtract(Convert.ToDateTime(GridView.Rows[i].Cells[1].Value));
        }
    }
    catch (Exception ex)
    {

    }

    label6.Text = ts1.ToString();
}
4

1 に答える 1

0

BackgroundWorker を使用してスレッド作業を行い、UI を更新する方法の一般的な考え方は次のとおりです。

var worker = new BackgroundWorker {WorkerReportsProgress = true};
worker.DoWork += this.ThreadWorkMethod;
worker.ProgressChanged += this.ThreadProgressMethod;
worker.RunWorkerAsync();

...

private void ThreadWorkMethod(object sender, DoWorkEventArgs e)
{
    var worker = (BackgroundWorker)sender;

    for (int i = 0; i = 1000; i++)
    {
        // Time consuming operation
        Thread.Sleep(1000);

        worker.ReportProgress(i * 100d / 1000, i);
    }
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Here you can access controls, etc.

    if (e.Progresspercentage == 100)
    {
        this.progLabel.Text = "100% Done";
    }
    else
    {
        this.progLabel.Text = string.Format("{0}% ({1} / 1000)",
                                            e.ProgressPercentage,
                                            e.UserState);
    }
}

また、イベントも聞きたい場合RunWorkerCompletedは、そこからコントロールにアクセスすることもできます。

したがって、DoWork メソッドはハード スレッド作業を実行し、ReportProgress を呼び出して、必要に応じていつでも UI を適切に変更できるようにするためのものです。RunWorkerCompleted イベントは、DoWork メソッドが完了する (戻るか終了する) ときに自動的に呼び出されます。

于 2012-06-12T14:52:36.917 に答える