2010-11-30 8 views
2

は私は別のスレッドで2 textboxsマルチスレッドWindowsアプリケーション

イムでフォームを持っていると私はそれらの一つ一つを呼び出し、値を得ることができることを私は理解し、それらの2 textboxsにテキストをcompineしたいその後、連結としましょうそれらを除いて

私はメインスレッドを掛けることなく2つのコントロールを一度に起動する方法を考えていました。

、私は値を取得し、その後呼び出すテキストボックスを一つずつ試してみましたが、それはいくつかの理由

メインスレッドをぶら下げずにいることを行う方法のいずれかのアイデアのための私のメインスレッドを絞首刑?

サンプル:事前に

txtFrom.Invoke(new MethodInvoker(() => strFrom = txtFrom.Text)); 
     txtTo.Invoke(new MethodInvoker(() => strTo = txtTo.Text)); 
     txtMessageBody.Invoke(new MethodInvoker(() => strMessageBody = txtMessageBody.Text)); 
     txtStartDate.Invoke(new MethodInvoker(() => strStartDate = txtStartDate.Text)); 
     txtEndDate.Invoke(new MethodInvoker(() => strEndDate = txtEndDate.Text)); 
     ddlStatus.Invoke(new MethodInvoker(() => intStatus = ddlStatus.SelectedIndex)); 

おかげ

Enviroments:

Windows 7の の.Net 4 Windowsフォーム C#

答えて

1

メインスレッドを掛けずにが2つのコントロールを一度に呼び出すと、ここに混乱があると思われます。

あなたが説明したようにInvokeのWinFormsでコントロールを使用している場合、それらのMethodInvokes内のコードは実際にUI /メインスレッドで実行されます。これは仕様であり、これらのコントロールを呼び出すとUIスレッドでコードが実行されるため、コントロールが元々作成されたスレッドでアクセスできるようになります。したがって、そのコードの長時間の操作では、UIスレッドがハングします。

したがって、長時間の操作は、おそらくBackgroundWorkerを使用して別のスレッドで開始する必要があります。

+0

私は、それは私がしようとし、diffスレッドで長い操作をするためにコードを再設計しようと思います私は戻ってあなたに知らせる – Stacker

2

彼らは同じ形に住んでいるので、それらはすべて同じGUIスレッドに属します。これは、呼び出しのターゲットとしてそれら(またはその親フォーム)のいずれかを使用し、1つの呼び出し内のすべての操作を行うことができますことを意味します

this.Invoke(new MethodInvoker(() => 
{ 
    strFrom = txtFrom.Text; 
    strTo = txtTo.Text; 
    strMessageBody = txtMessageBody.Text; 
    strStartDate = txtStartDate.Text; 
    strEndDate = txtEndDate.Text; 
    intStatus = ddlStatus.SelectedIndex; 
})); 

私はこれがあなたの問題を解決わからないが、それは、少なくともあなたを簡素化コード。

+0

私はこれを試しましたが、GUIをハングします – Stacker

+0

@Stacker:このコード内でハングすることは確かですか? –

+0

これは以前の次のコードです:gvResults.Invoke(new MethodInvoker(delegate(){// someCodeを使ってテキストを検索する}})); Gridを呼び出すとGridが呼び出されるのを見ることができます。なぜなら、Guiがハングする理由はありません。 – Stacker

3

代わりにBeginInvokeを使用できますか?私はいつもInvokeを避けます。デッドロックを引き起こす習慣があるため、アプリケーションをハングアップします。

この理由は、Invokeは、あなたのワーカースレッドが座って、UIスレッドが利用可能になるまで待ちます。 UIスレッドがワーカースレッドが何かをやるのを待っている可能性が高いため、問題になる可能性があります。 (たとえば、あなたのワーカースレッドはロックを持っている可能性があります。ライブラリコンポーネントの中にあるため知らないこともありますので、Implicit acquisition of locks or other unshareable resources can cause deadlocks even in single-thread codeなので、注意するのが最善です。 UIスレッドが何かを行うのを待ちます)。

Peter Lillevoldが指摘しているように、最終的にUIスレッドでは何も遅くならないようにする必要があります。しかし、あなたのサンプルコードから何が起こっているのかは明らかではありません。私はあなたのコードで、遅くなるような何も明らかではなく、あなたの説明からアプリケーションが完全にハングアップしたように聞こえました。 Invokeに起因するデッドロックが発生しました。

関連する問題