3

次のように新しいスレッドを生成するメソッドがあります。

Thread thread = new Thread(() => ClassObject.SetXY(var1, var2));
thread.SetApartmentState(ApartmentState.STA);               
thread.Start();
thread.Join(); 

(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))現在、試行中の COM 相互運用機能からアクセス拒否例外が発生します。同じ親スレッドで関数を実行しても、その例外は発生しません。ただし、アパートメントの状態を STA に設定するには、別のスレッドで実行する必要があります。現在、コードを Windows サービスとして実行していますが、メイン メソッドで [STAThread] を使用しても機能しません。

私が必要とするもの:

  • 1-上記のように、親スレッドと同じセキュリティコンテキストを持つスレッド (STA) を開始します。

  • 2- 新しいスレッドを開始しないでください (これによりアクセス拒否の問題は解決しますが、スレッドのアパートメント状態が STA ではないため例外がスローされます)、Windows サービスのスレッドを STA アパートメント状態で実行します。

ありがとう

4

1 に答える 1

0

親スレッドの実行コンテキストをコピーして、生成されたスレッドのそのコンテキストでコードを実行できます。

var executionContext = ExecutionContext.Capture();
Thread thread = new Thread(state => {
    ExecutionContext parentContext = (ExecutionContext)state;
    ExecutionContext.Run(parentContext, _ => {
        ClassObject.SetXY(var1, var2);
    }, null);
});

thread.Start(executionContext);
于 2012-08-15T17:40:10.040 に答える