1

私はアクションデリゲートを持っています:

public static Action SubscribeForTable;

私は自分のObjects方法でそれをロードしました

public void SubscribeMe()
{
    Parallel.For(0, ACCESS.GetAppCount(), AppCheck);
    CheckTable(true);
}

したがって、同じ関数を含むがオブジェクトが異なるデリゲートがあります。

次に、これを行います:

Parallel.Invoke(SubscribeForTable);

実行するために起動し、待機します...待機します...そして何も起こりません! アプリケーションが動かなくなった!次に、デバッガーを起動しました。

SubscribeMe()機能に戻る

Parallel.For(0, ACCESS.GetAppCount(), AppCheck); //OK
CheckTable(true);  // lets see what is in

それから私はこの機能を見ました..

delegate void CheckTableCallback(bool check);

private void CheckTable(bool Subscribed)
{
    if (DataGridView1.InvokeRequired) // OK
    {
        CheckTableCallback Safe = new CheckTableCallback(CheckTable);  // OK
        DataGridView1.Invoke(Safe, new Object[] {Subscribed}); //HANGS HERE!
    }
    else
    {
        ....

だからそれはハングアップしDataGridView.Invokeます。なんでそうなの?問題を正しく説明できたことを願っています。

4

1 に答える 1

2

Control.Invokeは、設計上、UI スレッドがメッセージを処理できるようになるまで現在のスレッドをブロックします。

UI スレッドからループを呼び出すと、Parallel.For完了するまで UI スレッドがブロックされます。

この 2 つは、一方の操作 (Invoke呼び出し) が他方の操作が完了して UI スレッドを解放するまでParallel.For完了できず ( )、2 番目の操作は個々の作業項目が完了するまで完了できないという状態を引き起こします。

UI を更新するだけの場合は、ここでデッドロックを回避するBeginInvoke代わりに使用できる場合があります。Invokeこれにより、実際のメソッド ( ) が実行され、操作全体が完了したCheckTableに値が設定されます。

于 2013-10-15T17:17:40.090 に答える