「1つのSTAスレッド上の複数のハンドルに対するWaitAllはサポートされていません.」ソリューション

2885 ワード

一、異常提示
1つのSTAスレッド上の複数のハンドルに対するWaitAllはサポートされていません.
エラー画面は次の図のとおりです.
二、解決方法
まず直接解決策に行きましょう.解决方法は简単です.次のコードのようにmain関数の「STAThread」属性を直接コメントすればいいのです.または[STAThread]を[MTAThread]に置き換える
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Sx.WF
{
    static class Program
    {
        /// <summary>
        ////// </summary>
        //[STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainFm());
        }
    }
}

 
げんりぶんせき
MSDNを研究した結果、コンソールプログラムの各主関数Mainの前に、現在のコンソールプログラムのスレッドモデルが単一スレッドであることを識別する[STAThread]方法の属性があることが分かった.具体的な説明は以下の通りです.
STAThreadAttributeは、アプリケーションのCOMスレッドモデルが単一スレッドユニット(STA)であることを示す.この属性をエントリポイントメソッド(C#およびVisual BasicのMain()メソッド)に適用します.他の方法では無効です.コードで起動するスレッドのセル状態を設定するには、スレッドを起動する前にThreadを使用します.SetApartmentStateメソッド.注意:はい.NET Framework 1.0および1.1では、スレッドを開始する前にThreadを設定します.ApartmentStateプロパティ.COMスレッドモデルはCOM interopを使用するアプリケーションにのみ適用されます.COM interopを使用しないアプリケーションにこの属性を適用した場合、効果はありません.COMスレッドモデルは、単一スレッドユニットまたはマルチスレッドユニットに設定することができる.アプリケーションスレッドが実際にCOMコンポーネントを呼び出した場合、COM interopのみがスレッドを初期化します.COM interopを使用していない場合は、この
この説明では、「COMスレッドモデルはCOM interopを使用するアプリケーションにのみ適用されます.COM interopを使用しないアプリケーションにこの属性を適用した場合、何の効果もありません.」そこで、この属性を削除しようとする、コンパイルが成功する.问题解决
解決:
デフォルトではNETプログラムは、作成時にデフォルトでスレッドモデルが単一スレッドユニットであるSTAとして設定ため、COM関連操作に関わらずコンソールプログラムMainの[STAThread]属性を外すマルチスレッド操作をサポートすることができる.
この文章の観点はインターネットがオリジナルではないことを考慮している.