linq2sqlクエリをキャンセルすることはできますか?実行に時間がかかるクエリを作成した場合と同様に、ユーザーがキャンセルできるようにしたいと考えています。誰もこれについて良いアイデアを持っていますか?C#:linq2sqlクエリをキャンセルすることはできますか?
4
A
答えて
2
ので、Richard Szalayのコメントによると:
あなたの最善の策は、バックグラウンドスレッドでクエリを実行し、単にユーザーのヒットキャンセル時にコンテナオブジェクトのイベントから退会することです。
これは大丈夫ですか?私が見たいと思うのは、すでにフレームワーク内にある非同期クエリ機能ですが、それが起こるまではこれが必要です。その後、
- 作業スレッドでは、別のクエリのスレッドでクエリを実行すると:
は、(最初のいくつかの他のものを完了する必要が)まだこれを実装するために始めたが、それは仕事ができる一つの方法はありませんかそのスレッドが終了するまで参加してください。
- ユーザーがキャンセルをヒットした場合は、作業スレッドの
Interrupt
メソッドを呼び出すと、ThreadInterruptedException
となり、クエリスレッドが終了するのを待たずに済みます。
私はそれを作る際に、後でいくつかのコードを追加することができます。しかし、我々はそれが判明どのようにかなり表示されます:P
-1
2
のプロパティをDataContextに設定すると、タイムアウトが経過すると自動的に例外がスローされます。
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");
}
}
関連する問題
- 1. config.options内のgraphqlクエリをキャンセルすることはできますか?
- 2. C#でデリゲートを介してメソッドをキャンセルすることはできますか
- 3. 特定のリクエストをキャンセルすることはできますか?
- 4. NKAssetDownloadをキャンセルすることはできますか?
- 5. RPCコールをキャンセルすることはできますか?
- 6. C#、Linq2Sql:2つのクエリ可能なものを連結することは可能ですか?
- 7. C#DTOとLINQ2SQL
- 8. UIPickerViewモーメントアニメーションをキャンセルすることができますか?
- 9. Linq2SQL継承型とOfTypeクエリ
- 10. Boost.Asio async_handshakeをキャンセルすることはできません
- 11. このクエリを改善することはできますか?
- 12. コンソールでテキストの選択をキャンセルすることはできますか?
- 13. Python 2.6で "keyword argument repeated"例外をキャンセルすることはできますか?
- 14. Microsoft Graphを使用してイベントをキャンセルすることはできますか?
- 15. 送信中にメッセージをキャンセルすることはできますか?
- 16. Google PlayサービスタスクAPI:タスクをキャンセルすることができます
- 17. linq2sqlのクエリから返す方法
- 18. iOS SDKで着信をミュートまたはキャンセルすることができます
- 19. ヘルプ建物までLINQ2SQLクエリが
- 20. LINQクエリを最適化することはできますか?
- 21. linq2sqlを使ってlinq2sqlクラスにレコードを選択していますか? linq2sql genereatedクラスでLinq2Sqlを使用して
- 22. C#から長時間実行されているLogParserクエリを安全にキャンセルすることはできますか?
- 23. CommandField:編集をクリックしたときに更新とキャンセルを禁止することはできますか?
- 24. このクエリをActiveRecordに書くことはできますか?
- 25. 条件のときに.Selectステートメント内で選択をキャンセルして「続行」することはできますか?
- 26. Elasticsearchクエリにコメントを付けることはできますか?
- 27. &で置き換えることはできますか? C++で
- 28. C#でカスタムコンパイラエラーを強制することはできますか?
- 29. コンテナテンプレートクラスをC++で抽出することはできますか?
- 30. C#でコンストラクタをオーバーライドすることはできますか?
私はこの解決策を推奨します。 ThreadInterruptedExceptionを使用するのは、Thread.Abortを使用する場合とまったく同じです。私はKieronの答えに私のコメントで投稿した記事を読むことをお勧めします。 –
ループに入り、旗や何かをチェックするのはどうですか?その後、キャンセルしたい場合は結果を待たずに戻ります。 – Svish