トップ回答者
MSDN WaitHandle.WaitAll メソッド のサンプルコード実行手順につきまして

質問
-
お世話になります。
MSDN WaitHandle.WaitAll メソッド のサンプルコード実行手順につきましての質問です。
長文となってしまい申し訳ありません。よろしくお願いいたします。WaitHandle クラス
http://64.4.11.251/ja-jp/library/system.threading.waithandle(VS.80).aspxを、Microsoft Visual Studio 2005(Professionl Edition、90日評価版、言語 = 英語)において、Visual Basic で実行すると、実行時エラーが発生します。
エラー発生個所
WaitHandle.WaitAll(waitHandles)エラー内容
NotSupportedException was unhandled
STA スレッドでの複数のハンドルの WaitAll はサポートされていません。WaitHandle.WaitAll メソッド (WaitHandle[])
http://64.4.11.251/ja-jp/library/z6w25xa6(VS.80).aspx内の「例外メッセージ 検索用」欄に、同メッセージが紹介されております。
また、エラーとなる原因ではないかと思われる情報を、以下のブログで確認いたしました。MSDN Blogs > The Visual Basic Team > STAThread 対 MTAThread (WHorst)
STAThread 対 MTAThread (WHorst)
http://blogs.msdn.com/b/vbteamjp/archive/2008/06/10/stathread-mtathread-whorst.aspx内
「C# プロジェクトは既定でマルチ スレッド アパートメント (MTA) を使用するのに対し、VB プロジェクトは既定でシングル スレッド アパートメント (STA) を使用することを人から指摘されました。…(中略)…
解決方法は、VBApp の Sub Main に MTAThreadAttribute を追加することでした。その後は正常に動作するようになりました。
<MTAThread> Sub Main()」試しに、サンプルコードをクラスからモジュールに変更してスタートアップ オブジェクトとして実行したところ、正常に動作しました。
コード変更の手順は以下のとおりです。1.サンプルコードの「Public Not Inheritable Class App」と「End Class」をコメントアウト
2.1.のコードを、Visual Studio の新規プロジェクト(Console Application)で、Module1.vb に移行
3.コンパイルエラーとなる箇所を調整(Importsステートメント の位置を移動、Sharedを削除、余計な改行を削除)このサンプルソースを、クラスのまま呼び出して動作させるための手順を教えていただけますと幸いです。
シングルスレッド アパートメント(STA)、マルチスレッド アパートメント(MTA)の概念を、現在学習中しています。
お手数をおかけいたします。
回答
-
Visual Studio 2010(Premium)でターゲットフレームワークを.NET 2.0にして試してみたところ、当方では問題なく動作しました。
一応、試した手順を書いておきます。
- VBのコンソールアプリケーションプロジェクトを新規作成します。
- ソリューションエクスプローラーでプロジェクト名を右クリックし、追加>クラスを選択します。
- 名前をAppに変更し、追加をクリックします。
- 追加されたAppクラスを開き、件のサンプルコードを入力します。
WaitHandleクラス
http://msdn.microsoft.com/ja-jp/library/system.threading.waithandle(v=VS.80).aspx - ソリューションエクスプローラーでプロジェクト名を右クリックし、プロパティを選択します。
- スタートアップオブジェクトをAppに変更します。
- ビルドして実行します。
- 回答としてマーク 山本春海 2011年9月21日 2:00
すべての返信
-
Visual Studio 2010(Premium)でターゲットフレームワークを.NET 2.0にして試してみたところ、当方では問題なく動作しました。
一応、試した手順を書いておきます。
- VBのコンソールアプリケーションプロジェクトを新規作成します。
- ソリューションエクスプローラーでプロジェクト名を右クリックし、追加>クラスを選択します。
- 名前をAppに変更し、追加をクリックします。
- 追加されたAppクラスを開き、件のサンプルコードを入力します。
WaitHandleクラス
http://msdn.microsoft.com/ja-jp/library/system.threading.waithandle(v=VS.80).aspx - ソリューションエクスプローラーでプロジェクト名を右クリックし、プロパティを選択します。
- スタートアップオブジェクトをAppに変更します。
- ビルドして実行します。
- 回答としてマーク 山本春海 2011年9月21日 2:00
-
Hongliang様、Alfred360様
ご返信いただき、ありがとうございます。
結果は、Alfred360様のご指摘通り、問題なく動作するサンプルでした。大変申し訳ありません。
C#でアプリケーション起動時に実行されるフォームを変更するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/196csstartup/csstartup.htmlより、クラスをスタートアップ オブジェクトとして設定する手順を確認いたしました。
投稿時は通常のクラスのメソッド呼び出し手順を実行しておりました(クラスをスタートアップ オブジェクトにすることを思いつきませんでした)。
今回、以下の流れで、このサンプルコードは正しく動作しない可能性があるのではないか、と推測(実行時エラーが出たため)をいたしました。・サンプルコードがクラスである
・VB プロジェクトは既定でシングル スレッド アパートメント (STA) を使用する
・クラスをスタートアップ オブジェクトにすることはできない(誤り)
→このクラスを動作させる場合、MTAを使用する別のスタートアップ オブジェクトから呼び出す必要がある(誤り)
クラスをスタートアップ オブジェクトとして使用できることから、最初の投稿で引用させていただきましたブログ
「C# プロジェクトは既定でマルチ スレッド アパートメント (MTA) を使用するのに対し、VB プロジェクトは既定でシングル スレッド アパートメント (STA) を使用することを人から指摘されました。…(中略)…
解決方法は、VBApp の Sub Main に MTAThreadAttribute を追加することでした。その後は正常に動作するようになりました。
<MTAThread> Sub Main()」
と、サンプルコードの内容が一致することを確認できました。この件は投稿者の技術力不足による勘違いということで、解決をさせていただきます。
皆様、ありがとうございました。※MSDNのサンプルコードは、基本的には正しく動作すると考えております。
また、カスタマー フィードバックにより記事は頻繁に更新されているため、個人的にはバージョン間の内容の違いなどを確認することで大変役立っております。
私は自力でソースコードを書くことが難しいため、よく利用をさせていただいております。カスタマー フィードバックが反映された例(「カスタマー フィードバック」で単語検索した一例です)
http://64.4.11.251/ja-jp/library/hxkc1kwd.aspxMTAThreadAttribute クラス
http://64.4.11.251/ja-jp/library/system.mtathreadattribute(VS.80).aspx- 編集済み aquatic bug 2011年9月8日 12:14