2017-03-07 10 views
-2

を形成しますxmlファイルのxml属性を4GBまで大きく変更する背景労働者は、私は、次の星座を持つアプリケーション

この小さなアプリケーションは機能しますが、UIが応答しなくなり、凍結してしまいます。このプロセスの継続時間を短縮したいと考えています

I st技術BtnClickイベントから私のxmlread /ライト方式の呼び出し:私はProgram.csが、そこ私のメインメソッド(changeElements)の私のシングルトンインスタンスを使用して呼に

void BtnApplyChangesClick(object sender, EventArgs e) 
    { 
     Program p = Program.Instance; 
     pbApplyChanges.Minimum = 0; 
     pbApplyChanges.Step = 1; 

     Cursor.Current = Cursors.WaitCursor; 
     foreach(DataGridViewRow cr in dataGridView2.Rows) 
     { 
      pbApplyChanges.Maximum = dataGridView2.Rows.Count; 
      p.changeElements(cr.Cells["Filename"].Value.ToString(), txtTenant.Text, txtDate.Text, txtEvtId2.Text); 
      pbApplyChanges.PerformStep(); 
     } 
     Cursor.Current = Cursors.Arrow; 
     MessageBox.Show("Job done"); 
    } 

は全て取られる4つの文字列のparamsを使用しフォームの情報から! (私はこれがちょっと悪い習慣だと思うけど、今まで働いていたと思う)

私はこのメソッド呼び出しをbackgroundWorker(それ自身がメソッド呼び出しを行った)に置き換えようとしたとき、メソッド呼び出しが私は、BWスレッドからUI要素にアクセスすることができないことを知ったので、これも私のメソッド呼び出しが動作しない理由です。

どうすればこの星座を使うことができますか?私はすべての4文字列Paramsと(Program.csの)クラスインスタンスをバックグラウンドワーカーに渡す必要がありますか? BWは仕事に最適なツールですか?

+0

いいえ、クラスとパラメータをグローバルにすることができます。 – Sergio

答えて

2

一般に、BackgroundWorkerはどのUI要素にもアクセスすべきではありません。 Winformsの古いアドバイスでは、UI-ElementへのアクセスはUIスレッドからのみ行われるべきです。

あなたはこのように背景-労働者を使用することができます:あなたが見hereを取る何か新しいことを学び、自分自身についてをお知らせしたいので、もし

private void Main(string[] args) 
{ 
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += Bw_DoWork; 
    bw.RunWorkerCompleted += Bw_RunWorkerCompleted; 

    //Parameter you need to work in Background-Thread for example your strings 
    string[] param = new[] {"Text1", "Text2", "Text3", "Text4"}; 

    //Start work 
    bw.RunWorkerAsync(param); 
} 

//Do your Background-Work 
private void Bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string[] param = e.Argument as string[]; 

    //Process your long running task 

    e.Result = null; //Set your Result of the long running task 
} 

//Taking your results 
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //Apply your Results to your GUI-Elements 
    myTextBox1.Text = e.Result.ToString(); 
} 

背景-労働者は、途中でいくつかの古い学校のものですTPL。これにより、非同期の処理が向上します。

実際、XMLファイルに4GBのデータを格納するのは本当に良いとは思えません。あなたはデータベースについて考えますか?または、多くのXMLファイルでXMLファイルを分割しますか?つまり、チャンク内のデータを読み取ることができます。

私はこれがあなたを助けてくれることを願っています。

+0

こんにちはsebi、これは役に立ちますが、私の主な問題は解決しません。私のDataGrid(通常は19-21ファイル内のxmlファイルを表しています)の行を繰り返し処理します。foreachを作成する必要があります。 backgroundworkerDoWorkでもデータグリッドはそこからアクセスできません...また、DataGridオブジェクトをbackgroundworkerに渡す必要がありますか? – KlausKerner

+0

@KlausKerner DataGridをどのように埋めるのですか? DataTableなどのDataSourceが必要です。この引数をBackgroundWorkerに渡します。 GUI要素はありません。 – Sebi

+0

あなたが正しいと確信しています。使用できるDataTableです。完全に忘れましたTHX – KlausKerner

0

私はこのためにバックグラウンドワーカーを使用しません。私は代わりに通常のスレッドを使用します。このコードを試してみてください。

public void ButtonDoWork_Click(eventArgs......) { 
    DoWorkThread = new Thread(new ThreadStart(DoWork)); // Setup thread 
    DoWorkThread.isBackground = true; // Its background so, we need to set background flag 
    DoWorkThread.Start(); // Start the thread 
} 

private Thread DoWorkThread: // our Thread object 
private void DoWork() { // This void contains action that will be performed by thread 
    //TODO: Background processing. To update UI from another thread use Control.Invoke(...) 
} 

注意してください、私はこのコードをテストしていない - 私は私の記憶からそれを書いて、それが動作することはできませんので、それは遅。

MSDNのスレッドについて読むこともできます。

+0

入力のためのthx、これまでのところbgworkerは最後にやったことがあります。私はプログレスバーでセットアップするのが簡単なので、ちょっとしたアプリにちょっとした感覚を覚えるのが好きです...しかし、パフォーマンスは非常に良いかもしれませんが、特にパラレル実行は、5-1500 mbの範囲で約20のxmlファイルを処理する必要があるため、多くの意味があります;) - >これは私の決定ではありません。それは可能性があります... – KlausKerner

関連する問題