在后台线程上c#中未经授权的错误

时间:2017-09-02 18:56:09

标签: c# asp.net multithreading threadpool

我创建了一个ASP.NET Web应用程序,其中需要删除一个文件。下面是完美执行此操作的代码

File.Delete(path);

但是,当我尝试在像这样的后台线程上执行此操作时

Task.Run(() => File.Delete(path));

然后它会抛出一个异常,即拒绝访问此路径。我试过给IIS_IUSRS和IUSR完全访问路径,但仍然存在错误。有人可以解释这里发生了什么。如何使用第一个代码删除文件,即在主线程上,但不在后台线程上删除。 C#中的背景线程是否以不同的身份运行?

1 个答案:

答案 0 :(得分:-2)

您提供的两种方法之间的主要区别在于File.Delete(path)立即调用WinAPI函数DeleteFileTask.Run(() => File.Delete(path))执行相同的延迟。

在这么短的时间内可能会发生一些事情。例如。 Windows Search服务可以打开文件进行索引,防病毒可以打开文件进行分析,或者其他一些进程可以对此进行处理(我假设)新创建的文件。

如果您确定您的应用程序以后没有重新打开此文件并且不在任何地方保留文件句柄,我建议使用多次尝试来避免此类问题:

Task.Run(() =>
{
    const int attemptsNum = 10;
    for (int attempt = 0; attempt < attemptsNum; attempt++)
    {
        try
        {
            File.Delete(path);
            break;
        }
        catch
        {
            if (attempt == attemptsNum - 1)
            {
                throw; // or log exception here
            }
            else
            {
                await Task.Delay(500);
            }
        }
    }
});