我做了一个在.sqlite中创建数据库的代码,所有工作都很好,但我想确保当用户第一次启动应用程序时必须完成数据库填充。如果用户中止数据库填充,则必须删除数据库(因为应用程序不使用不完整的资源)。现在,我已经使用了线程执行的是创建该数据库的方法,我已经声明了线程变量的类全球,如:Thread.Abort没有发布文件
Thread t = new Thread(() => Database.createDB());
的Database.createDB()
方法创建数据库。所有工作完美,数据库创建正确。现在我火,创建数据库,例如窗口的关闭:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
MessageBoxResult result = MessageBox.Show(
@"Sure?",
"Attention", MessageBoxButton.YesNo, MessageBoxImage.Question);
try
{
if (result == MessageBoxResult.Yes)
{
t.Abort();
if (File.Exists("Database.sqlite"))
{
File.Delete("SoccerForecast.sqlite");
Process.GetCurrentProcess().Kill();
} ....
该事件被触发正确的线程停止,但在条件启动if (File.Exists("Database.sqlite"))
编译器告诉我:
灿” t删除文件 - 正在被另一个进程使用。
但我已经停止线程,为什么会出现此异常?我做错了什么?
UPDATE:
在CREATEDB()方法我也有不同类的其他方法的调用,这一个具有这样的结构:
public void setSoccer()
{
Database.m_dbConnection.Open();
string requestUrl = "...";
string responseText = Parser.Request(requestUrl);
List<SoccerSeason.RootObject> obj = JsonConvert.DeserializeObject<List<SoccerSeason.RootObject>>(responseText);
foreach (var championships in obj)
{
string sql = "string content";
SQLiteCommand command = new SQLiteCommand(sql, Database.m_dbConnection);
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
string query = "select * from SoccerSeason";
SQLiteCommand input = new SQLiteCommand(query, Database.m_dbConnection);
SQLiteDataReader reader = input.ExecuteReader();
int i = 0;
while (reader.Read())
{
//reading data previously inserted in the database
}
Database.m_dbConnection.Close();/
}
我想知道在哪里应该把标志变量,因为这个代码有一个不同的循环里面。
这个目的一的CancellationToken对象中止线程几乎总是错误的做法。找到一种更优雅的方式让线程知道它应该退出,然后让它干净地(例如'ManualResetEvent'或类似的) –
中止“强制终止受影响的线程,即使它尚未完成其任务并且不提供清理资源的机会。” –
请阅读http://stackoverflow.com/questions/9272332/what-is-a-safe-way-to-stop-a-running-thread –