2016-05-23 23 views
0

長時間実行されている操作でwinFormを作成する方法のヒントについては、私が参照できるリソースはありますか?長時間実行する操作を実行するには?

私のシナリオはこれです。 APIを呼び出し、複数の列と約10,000行以上のデータグリッドビューにデータを格納するWinFormがあります。

異なる列の値の別個のインスタンスを数えたり、数値を得るために数式演算子を実行したりするなど、複数の操作を実行しています。そのアプリケーションは約2000行で動作しますが、4000になるとCOMエラーなどが発生して実行を停止します。

私はUIにアクセスできるかどうか気にしません。実行するにはアプリケーションが必要です。

+0

答えがあなたにはこれを実証できるようにソースコードを提供してください –

+0

スレッドやその他のプロセスを使用してバックグラウンドで操作を実行する必要があります - これを行う最も一般的な方法はスレッド化ですが、これを行う。おそらく、この[スレッドチュートリアル](https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx)や数多くの類似記事のいずれかから始めることをお勧めします。 – Tibrogargan

+0

COMエラー(例外情報)についてより具体的に記述してください。 –

答えて

2

長時間実行されている操作でwinFormを作成する方法に関するヒントはありますか?

確かに、この種のものには多くのリソースがあります。あなたはおそらくBackgroundWorkerを探しています。それには素晴らしいコードプロジェクト "here"があります。

public partial class Form1 : Form 
{ 
    BackgroundWorker backgroundWorker; 

    public Form1() 
    { 
     InitializeComponent(); 

     backgroundWorker = new BackgroundWorker(); 
     backgroundWorker.DoWork += OnDoWork; 
    } 

    void OnDoWork(object sender, DoWorkEventArgs e) 
    { 
     // Long running code here. 
    } 
} 

BackgroundWorkerは、キャンセル、さらに進捗状況の報告をサポートします。さらに、実装したい他の重要なイベントがいくつかあります。

フォームを使用してフォームを作成すると、オブジェクトをクリーンアップして処分することが理想的です。さらに、クリーンアップの一環としてイベントハンドラを必ず付けなければなりません。別のresourceがあります。

+0

私は、メソッド内で直接多くのUIオブジェクトを使用します。これは悪い習慣ですか?たとえば、操作を実行する前に値が設定されているlistbox1がある場合、listbox1.textを使用してそのメソッドで呼び出します。 UIオブジェクトを呼び出す方法があるので、エラーが出ないようにしますが、すべてのオブジェクト値を変数に格納する方が良いでしょうか? – Sewder

+0

UIを操作して操作をUIスレッドにマーシャリングするときは、 'Invoke/BeginInvoke'を使ってこれを行うことができます。私はこの数年前に拡張メソッドを書いた。 https://onlycsharp.wordpress.com/sharpening/extension-methods/ –

+1

なぜtplを使用していることがmsdnに記載されている場合、バックグラウンドワーカーを使用してアドバイスするのですか? https://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspxを参照してください。また、backgroundworkerをasync/awaitに置き換える方法については、Stephen Clearyのこの記事を参照してください。 Invoke/BeginInvokeなどは必要ありません。 –

関連する問題