0

オンラインの MSDN 記事から C# WPF アプリのコードを起動しようとしています:「方法: Visual Studio 2010、Windows XP SP3、.NET4.0 で ユーザー インターフェイス (UI) スレッドの作業をスケジュールする」

私が行った唯一の違い:

  1. 名前空間を からwpfApplication1に変更しました (記事の「1. Visual Studio で WPF アプリケーション プロジェクトを作成し、名前を付ける」 WpfApplication1と矛盾するため。

  2. 行を置き換えた

    string[] files = System.IO.Directory.GetFiles(@"C:\Users\Public\Pictures\Sample Pictures\", "*.jpg");
    

    string[] files = System.IO.Directory.GetFiles(@"D:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\", "*.jpg");
    

    (私の Windows XP マシンの構成によると)

しかし、ボタンを押した後、アプリは例外で壊れます:

タスクの待機中またはその Exception プロパティへのアクセスによって、タスクの例外が確認されませんでした。その結果、監視されていない例外がファイナライザー スレッドによって再スローされました。

コードはエラーなしでコンパイルされますが、次の行があります。

Matrix m = PresentationSource.FromVisual(Application.Current.MainWindow)

ポップアップ警告を示す波線付きの Intellisense があります。

「'System.NullRederenceException' の可能性があります」

可能性のある「System.NullRederenceException」

私の VS2010 ソリューション (この記事を再現しようとしている) は、
http ://wikisend.com/download/404394/msdnHow2ScheduleWorkOnTheUI.rar からダウンロードできます。

このコードの何が問題になっていますか?
そして、それを修正する方法は?

更新:
問題は、例外メッセージを観察する方法ではなく、MSDN サンプル コードを起動する方法です (私のような初心者による)。

例外に固有の質問を個別に行うことを希望します

Update2:
Errata:
申し訳ありません...
前に書いたように、アプリケーションは壊れません。

ボタンクリックイベントハンドラ MessageBox.Show("Finished");の最後に挿入しました。button1_Click()

ボタンを最初にクリックすると、MessageBox に "Finished!" が表示されます。現れます。
2回目にクリックすると、メッセージボックスが再び表示されますが、アプリは上記の例外もスローします。

最初のクリック後

そして、例外メッセージとタスクの結果を確認しましたが、何が問題なのかわかりません!
記事のトピックの作業サンプルに興味があり、デバッグに関する質問を他の質問に個別に投稿することを強調したいと思います!

他の人が再現できますか?

4

1 に答える 1

1

問題は、タスク内で例外が発生していることです。このメッセージは一目瞭然ですが、TPL での例外処理について知っている場合に限ります。したがって、正確なエラーをさらに詳しく説明するには:

タスク内から例外がスローされた場合、次の 3 つの方法で「監視」する必要があります。

  1. タスクのExceptionプロパティを確認する
  2. タスクのプロパティを読み取ろうとしResultます (格納された例外がスローされます)
  3. イベント ハンドラーをTaskScheduler.UnobservedTaskException

上記のいずれの方法でも確認されない場合、ガベージ コレクターがタスクを終了しようとしたときに、最終的に例外がスローされます。これが、あなたが受け取っている正確なメッセージの理由です。ただし、より深い元の例外については、上記の 3 つの手順のいずれかを実行し、実際の例外を確認する必要があります。

これは、TPL での例外処理に関する MSDN です。

また、参考までに、この観察されていない例外を処理する必要はないようですが、私は個人的に掘り下げていません。それでも、他のコードと同じようにこれらを処理する方がよいでしょう。したがって、この変更によってコードの記述方法が変わることはありません。

于 2013-03-30T03:23:40.630 に答える