我有一个Windows窗体应用程序,该程序运行一些任务以读取数据库sqlite,如果文件在计算机上运行则发送该文件,否则执行相反的操作(读取数据并填充另一个sqlite数据库)。
如果我以用户身份运行应用程序似乎没问题,但是如果我创建了计划任务(在Windows 10或Windows Server 2012上),我会看到状态始终在运行,有时我在自定义日志中看到的错误消息为
System.IO.Exception:进程无法访问文件c:... mydatabase.db,因为它被另一个进程使用。
我认为预定的任务过程没有结束,因此它尝试访问先前执行中正在使用的资源 有可能吗?
我将获得与已设置的其他任务一样的状态“就绪”。
我认为在program.cs上将异步作为我的主要方法不是一个好主意。
在我的代码中,您看到我创建了sqlite数据库,如果任务完成,我将创建一个zip文件,并使用ftp发送该zip。
static async Task Main(string[] args)
{
args = new string[] { "ARGUMENT1" };//test
if (args != null && args.Length > 0)
{
var task = args[0];
if (task == "ARGUMENT1")
{
var form = new SerializerForm();
try
{
var serialize = Task.Run(async () =>
{
await form.SerializeDbToSQLiteAsync();
});
serialize.Wait();
if (serialize.Status == TaskStatus.RanToCompletion)
{
Task.Run(async () =>
{
await form.CompressDatabaseAsync();
}).Wait();
Task.Run(async () =>
{
await form.FtpUploadAsync();
}).Wait();
await form.SendMailAsync($"Serializer complete");
}
}
catch (Exception ex)
{
string errorMessage = $"ex...";
await form.SendMailAsync(errorMessage);
await form.LogAsync("SerializationScheduled", errorMessage);
}
}
else
{
var form = new DeserializerForm();
//perform deserialization
}
else
{
//normal esecution windows form
}
}
更新 虽然我的代码很糟糕,但问题不在于使用async / await(正如大家所说的那样,我再说一遍是不好的)。 我注意到使用静态方法确实可以实例化SerializerForm对象,我注意到代码在两种情况下均能很好地工作:当用户运行程序以及我计划应用程序时
那么你能解释为什么吗? 提前Tks