2014-09-05 3 views
2

У меня возникла проблема при создании файла (база данных 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 
      } 
     } 
    } 
} 
+0

Вы используете 'SQLLiteCommand' в своем коде? –

+0

@YuvalItzchakov Я, но все они тоже используют блоки. – Moop

+1

[This] (http://stackoverflow.com/questions/12532729/sqlite-keeps-the-database-locked-even-after-the-connection-is-closed) похоже на аналогичный вопрос –

ответ

-1

У меня была аналогичная проблема и вызов GC.Collect() в одиночку не всегда помогает, когда она начинает сбор мусора в фоновом потоке, поэтому он немедленно возвращается.

Try вызова

GC.WaitForPendingFinalizers(); 

после GC.Collect().

+0

Не повезло, Спасибо хоть – Moop