У меня возникла проблема при создании файла (база данных Sqlite) внутри долговременного Task
Я не могу правильно удалить его, если задача была отменена. Он выбрасывает IOException
о том, что он используется в другом процессе, я предполагаю, что другой процесс - это Task
.Удаление файла, хранящегося в другом процессе, когда задача отменена
Он действительно удаляет, если я не отменяю задачу и не завершу ее.
var cancellationTokenSource = new CancellationTokenSource();
var cancellationToken = cancellationTokenSource.Token;
string dbFilePath = @"C:\test.db";
Task.Factory.StartNew(() =>
{
PopulateDatabase(dbFilePath);
}, cancellationToken).ContinueWith((result) =>
{
GC.Collect();
File.Delete(dbFilePath); // <--- Used in other process exception occurs here
}, TaskScheduler.FromCurrentSynchronizationContext() // Called from a GUI thread
);
cancellationTokenSource.Cancel(); // This occurs after the task is running
// I use using blocks in here, so the proper dispose methods should be called.
private void PopulateDatabase(string filePath) {
using(var conn = new SQLiteConnection(@"Data Source="+filePath+";")) {
// Do a bunch of work
}
}
Я даже попытался изменить PopulateDatabase
взять в CancellationToken
и выйти изящно, но возникает та же ошибка.
private void PopulateDatabase(string filePath, CancellationToken cancelToken) {
using(var conn = new SQLiteConnection(@"Data Source="+filePath+";")) {
// Do a bunch of work
while(true) {
if (cancelToken.IsCancellationRequested)
{
return; // I assume this calls the appropriate Dispose methods
}
}
}
}
Вы используете 'SQLLiteCommand' в своем коде? –
@YuvalItzchakov Я, но все они тоже используют блоки. – Moop
[This] (http://stackoverflow.com/questions/12532729/sqlite-keeps-the-database-locked-even-after-the-connection-is-closed) похоже на аналогичный вопрос –