7

このコードでこのエラーがどのように起こっているのか本当に分かりません。コードを自分で確認してください保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが壊れていることを示しています。

void dispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    string srUrl = lstLocalIndex[irLocalIndex] + lstMainIndex[irMainIndex].Replace("0;",""); 

    Task.Factory.StartNew(() => 
    { 
     startNewWindow(srUrl); 
    }); 

} 


    void startNewWindow(string srUrl) 
{ 
    NewWindowThread<TitleWindow, string>(c => new TitleWindow(c), srUrl); 
} 

ここでこのコードはエラーが発生した場所です。私はまた、このエラーは、ソフトウェア全体のスローエラーが発生し、私は新しいスレッドでそれらを呼び出していていても動作を停止し、スクリーンショット

 private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window 
    { 
     Thread thread = new Thread(() => 
     { 
      T w = constructor(param); 
      w.Show(); 
      w.Closed += (sender, e) => w.Dispatcher.InvokeShutdown(); 
      try 
      { 
       System.Windows.Threading.Dispatcher.Run(); 
      } 
      catch 
      { 

      } 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     try 
     { 
      thread.Start(); 
     } 
     catch 
     { 

     } 
    } 

を添付します:(

エラーSystem.Windows.Threading.Dispatcherを投げてこの行を。ファイル名を指定して実行();

は確認してくださいまた、

enter image description here

スクリーンショット0

C#4.0 WPF

+0

実際には 'Task'のものと' Thread'の中の* 2つのスレッドを使用しています。これは 'Thread'にスタートアップコードとして実行したいコードを置く方が良いでしょう。 – casperOne

+0

@casperOne私はまだアプリケーションをクラッシュさせてみました。これはしばらくしてからすぐには起こりません。それは30分のように実行され、クラッシュします。クラッシュする時間が変わります。 – MonsterMMORPG

+0

いいえ、彼らはあなたの記憶が壊れていると言います。それはそうでなければなりません! (btwは、私が「不特定のエラー」の後に遭遇した馬鹿馬鹿しいエラーメッセージです)。 – leppie

答えて

0

ラムダをスレッド関数として使用しています。このラムダは新しいスレッドで呼び出されます。 スレッドが実際に作成された時点で、ローカル変数srUrlである引数を検索しますが、関数(dispatcherTimer_Tick)がすでに終了した時点でsrUrlはその一部になります。スタックが適切に定義されなくなりました(したがって、アクセス違反)。簡単な修正は、クラス内の変数を定義し、そこにsrLocをすばやく埋め込むことです。より適切な解決策は、実際には、引数としてsrLocを渡すことです:

() => 
{ 
    startNewWindow(srUrl); 
} 

今すぐ関数参照と文字列の適切なコピーが関数呼び出しのために保存されている

​​

になり、それはdoesnの元のsrUrlはスレッドが起動するまでに範囲外です。タスクファクトリが引数配列を渡すことができるかどうかはわかりません。ディスパッチャには通常、このためのオーバーロードがあります。そのため、ウィンドウにこの処理をさせたいことがあります。

これは実際には数回実行されるため、渡されるたびに引数をラップする必要があります。

+0

お返事ありがとうございます。実際に私はファイルからURLを読み取る別のアプリケーションを書くことで私の問題を解決しました。だから私は新しい窓の代わりにexesを今始めている。いくつかのこれらの新しいexesエラーを与えるが、ソフトウェアを実行し続ける:)しかし、あなたの答えは本当に私はそれが好きプロフェッショナルです。 – MonsterMMORPG

+1

@MonsterMMORPGこの回答は論理的かもしれませんが間違っています。クロージャは、ローカル変数(フリー変数と呼ばれます)を取得します。こちらもご覧ください:http://www.codethinked.com/c-closures-explained – ChrisWue

+0

これが真だった場合は、ウィンドウを表示する前にコードが壊れてしまいます。ウィンドウを表示した後、srUrlは使用されていません。 – surfen

1

私は以前も同様の問題を抱えていました。

このエラーは、ウィンドウが有効範囲外になり、ガベージコレクタが破棄されるために発生します。

を使用すると問題が解決するはずです。これは、ウィンドウが呼び出し側スレッドのみでモーダルになるため、他のスレッドをブロックしないことに注意してください。

private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window 
{ 
    Thread thread = new Thread(() => 
    { 
     System.Windows.Threading.Dispatcher.Run(); 
     T w = constructor(param); 
     w.ShowDialog(); 
     w.Dispatcher.InvokeShutdown(); 
    }); 
    thread.SetApartmentState(ApartmentState.STA); 
    try 
    { 
     thread.Start(); 
    } 
    catch 
    { 
     // log&handle exceptions 
    } 
} 
+0

trueの場合、ロードされたイベントでイベントを設定し、そのイベントを待ってからデリゲートを終了することで、何かsimmilarを実行できます。 – Yaur

+0

これは理にかなっていますが、新しく作成されたウィンドウのUIをブロックしませんか? – surfen

+0

お返事ありがとうございます。今しようとする。 – MonsterMMORPG

2

私はこの問題を顧客と戦い、ここで私が見つけたのです。

スレッド処理とバックグラウンドワーカーの処理が多いWPFアプリケーションに取り組んでいます。この例外は突然切り詰め始め、私はいくつかの掘り出しをやり始めました。起こっているように見える何

 var worker = new BackgroundWorker(); 
     worker.DoWork += (o, ea) => Dispatcher.BeginInvoke(new Action(() => 
     { 
      //do some heavy processing here, plus UI work, then call another method. 

      //inside that other method, I found this: 
      var thread = new Thread(() => 
      { 
       //do some heavy processing. 
      }) { IsBackground = true }; 
      thread.Start(); 
     })); 

背景労働者が作業を終え、その実行から戻っていることである:私は最終的に捜査の程度時間後に犯人を見つけました。ただし、そのバックグラウンドワーカーの内部で作成されたスレッドは処理されず、作成されたスレッドがすでにスコープから外れているため、AccessViolationExceptionが発生します。

これをデバッグするには、例外が発生した場所に細心の注意を払って、呼び出しスタックを詳細に調べることをお勧めします。コールスタックは、スレッド内にあるかどうかによって破壊されるかどうかによって失われます。例外がスローされます。

関連する問題