2009-03-04 6 views

答えて

2

ので、Richard Szalayのコメントによると:

あなたの最善の策は、バックグラウンドスレッドでクエリを実行し、単にユーザーのヒットキャンセル時にコンテナオブジェクトのイベントから退会することです。

これは大丈夫ですか?私が見たいと思うのは、すでにフレームワーク内にある非同期クエリ機能ですが、それが起こるまではこれが必要です。その後、

  • 作業スレッドでは、別のクエリのスレッドでクエリを実行すると:

    は、(最初​​のいくつかの他のものを完了する必要が)まだこれを実装するために始めたが、それは仕事ができる一つの方法はありませんかそのスレッドが終了するまで参加してください。

  • ユーザーがキャンセルをヒットした場合は、作業スレッドのInterruptメソッドを呼び出すと、ThreadInterruptedExceptionとなり、クエリスレッドが終了するのを待たずに済みます。

私はそれを作る際に、後でいくつかのコードを追加することができます。しかし、我々はそれが判明どのようにかなり表示されます:P

+0

私はこの解決策を推奨します。 ThreadInterruptedExceptionを使用するのは、Thread.Abortを使用する場合とまったく同じです。私はKieronの答えに私のコメントで投稿した記事を読むことをお勧めします。 –

+0

ループに入り、旗や何かをチェックするのはどうですか?その後、キャンセルしたい場合は結果を待たずに戻ります。 – Svish

-1

おそらく別のスレッドで実行し、その代わりにキャンセルする必要があると思います。

+0

どのようにスレッドをキャンセルすることができますか? – Svish

+0

私はこの道を行くことをお勧めしません。 Thread.Abortを使用するのは悪い習慣であり、スレッドを中止することさえ保証しません。参照してくださいhttp://msdn.microsoft.com/en-us/library/ty8d3wta.aspx –

+0

ええ、私は同様にそのようなものを読んでいた。 – Svish

2

のプロパティをDataContextに設定すると、タイムアウトが経過すると自動的に例外がスローされます。

+0

しかし、クエリが実行されている間にそれを設定できますか?別のスレッドの – Svish

+0

? – Svish

+0

いいえ - コマンドを開始する前に設定する必要があります。クエリが実行されている間に定義された動作が変更されることはわかりません。 –

0

私はこの答えは一種の後期である知っているが、これは私がそれを行う方法です。

class Program 
{   
    public class Person 
    { 
     public string Name; 
     public int Age; 
    }   

    public static void ExecuteQueryAsync (IEnumerable<Person> collectionToQuery , Action<List<Person>> onQueryTerminated , out Action stopExecutionOfQuery) 
    { 
     var abort = false; 

     stopExecutionOfQuery =() => 
     { 
      abort = true; 
     };    

     Task.Factory.StartNew(() => 
     { 
      try 
      { 
       var query = collectionToQuery.Where(x => 
       { 
        if (abort) 
         throw new NotImplementedException("Query aborted"); 

        // query logic: 
        if (x.Age < 25) 
         return true; 
        return 
         false; 
       }); 

       onQueryTerminated(query.ToList()); 

      } 
      catch 
      { 
       onQueryTerminated(null); 
      } 
     }); 
    } 


    static void Main (string[] args) 
    { 
     Random random = new Random(); 

     Person[] people = new Person[ 1000000 ]; 

     // populate array 
     for (var i = 0 ; i < people.Length ; i++) 
      people[ i ] = new Person() { Age = random.Next(0 , 100) }; 

     Action abortQuery; 
     ExecuteQueryAsync(people , OnQueryDone , out abortQuery); 

     // if after some time user wants to stop query: 
     abortQuery(); 

     Console.Read(); 
    } 

    static void OnQueryDone (List<Person> results) 
    { 
     if (results == null) 
      Console.WriteLine("Query was canceled by the user"); 
     else 
      Console.WriteLine("Query yield " + results.Count + " results"); 
    } 
} 
関連する問題