2017-03-13 72 views
2

(Py.GIL())ブロックを使用して例外を処理する方法はありますか?例えば(Py.GIL())ブロックを使用して例外を処理する方法pythonnet

using System; 
    using Python.Runtime; 

    public class Test{ 
     public static void Main(){ 
      using(Py.GIL()){ 
       try{ 
        dynamic module = Py.Import("module"); 
        dynamic result = module.function("argument"); 

        Console.WriteLine(result); 
       } 
       catch(Excepiton ex){ 
        // Handled Exception 
       } 
      } 
     } 
    } 

私はusing(Py.GIL())ブロックを使用するC#の関数を呼び出す、ので、私はこの質問をしました。メインスレッドが完了するのを待つ新しいスレッドで実行されます。それは最初のラウンドのために働き、次のラウンドではusing blockに止まり、例外を表示せずにアプリケーションがフリーズします。

メインスレッドが実行を待機するのを止めようとしましたが、ワーカースレッドの実行はすべて、最初のラウンド後にPy.GIL()using blockで停止します。

スレッドの実行に関して、私はスレッドプールを使用しています。

Thread.Factory.StartNew(FunctionName); 
+1

@denfromufaご返信ありがとうございます。あなたはこのリンクをチェックすることができますhttp://stackoverflow.com/questions/42759968/worker-thread-stops-execution-when-it-reaches-at-using-block-c-sharp-windows-for – ash

+0

完全に再現可能な例は便利です。実行中はいつでも、1つのCLRスレッドのみがGILを取得できます。 – denfromufa

答えて

1

この問題は、Pythonがスレッドをどのように処理するかに起因します。 メインスレッドはPythonエンジンを初期化し、スレッドを許可する必要がありました。

PythonEngine.Initialize(); 
PythonEngine.BeginAllowThreads(); 

using(Py.GIL()) blockを使用するワーカースレッドを使用する前に、メインスレッドで上記のコードを実行します。

関連する問題