是否可以取消linq2sql查询?比如我已经构建了一个需要运行一段时间的查询,我希望用户可以取消它。有没有任何好的想法?
是否可以取消linq2sql查询?比如我已经构建了一个需要运行一段时间的查询,我希望用户可以取消它。有没有任何好的想法?
我认为我同意这是一个可以接受的解决方法。我希望能够看到一些异步查询功能已经集成在框架中,但在这种情况下,我们只能这样做。你最好在后台线程中运行查询,当用户点击取消时,从容器对象的事件中简单地取消订阅。
Interrupt
方法,然后会收到ThreadInterruptedException
并停止等待查询线程的完成。我知道这个答案有点晚,但这是我实现它的方式:
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" );
}
}