C# Filestream不会为其他进程释放文件

C# Filestream不会为其他进程释放文件,c#,C#,我有以下代码来编写一个文件。问题是,如果我想覆盖同一个文件,它是“锁定”的。该文件由另一个进程打开 using (FileStream fs = new FileStream("C:\\New\\" + fileName, FileMode.Create, FileAccess.ReadWrite)) using (StreamWriter str = new StreamWriter(fs)) { str.Write(jsonFile); str.Dispose();

我有以下代码来编写一个文件。问题是,如果我想覆盖同一个文件,它是“锁定”的。该文件由另一个进程打开

using (FileStream fs = new FileStream("C:\\New\\" + fileName, FileMode.Create, FileAccess.ReadWrite))
using (StreamWriter str = new StreamWriter(fs))
{
    str.Write(jsonFile);
    str.Dispose();
    str.Close();
}
我向API发送一个json字符串,然后API生成文件。所以我想这可能是IIS的一个问题

编辑: 通过研究,我仍然尝试了下面的代码,但结果是一样的

using (FileStream fs = new FileStream("C:\\New\\" + fileName, FileMode.Create, FileAccess.ReadWrite))
{
    StreamWriter sw = new StreamWriter(fs);
    sw.Write(jsonFile);
    fs.Flush();
    fs.Close();
}
编辑2: 阅读注释后,它可能与文件流本身无关。以下是有关我的申请的更多信息: 我有一个WPF应用程序,它通过一个按钮点击向我的API发送帖子。这将按如下方式触发:

private async void btnSend_Click(object sender, RoutedEventArgs e)
    {
        await Seal();
    }
密封方法说明如下:

private async System.Threading.Tasks.Task Seal()
    {
        var result = await RequestManager.DoPost<bool>("FOO", foo);
    }
public static async Task<R> DoPost<R>(String route, Object payload, String contenttype)
    {
        var serializer = new JavaScriptSerializer();

        route = route.StartsWith("/") ? route : "/" + route;

        var content = new StringContent(serializer.Serialize(payload), Encoding.UTF8, contenttype);

        var response = await client.PostAsync(RequestManager.API_URL + route, content);

        if (response.StatusCode == HttpStatusCode.OK)
        {
            var result = await response.Content.ReadAsStringAsync();
            return (R)serializer.Deserialize(result, typeof(R));
        }
        else
        {
            throw new ResponseException(response.StatusCode, response.Content.ReadAsStringAsync().Result);
        }
    }
private async System.Threading.Tasks.Task Seal()
{
var result=await RequestManager.DoPost(“FOO”,FOO);
}
RequestManager说:

private async System.Threading.Tasks.Task Seal()
    {
        var result = await RequestManager.DoPost<bool>("FOO", foo);
    }
public static async Task<R> DoPost<R>(String route, Object payload, String contenttype)
    {
        var serializer = new JavaScriptSerializer();

        route = route.StartsWith("/") ? route : "/" + route;

        var content = new StringContent(serializer.Serialize(payload), Encoding.UTF8, contenttype);

        var response = await client.PostAsync(RequestManager.API_URL + route, content);

        if (response.StatusCode == HttpStatusCode.OK)
        {
            var result = await response.Content.ReadAsStringAsync();
            return (R)serializer.Deserialize(result, typeof(R));
        }
        else
        {
            throw new ResponseException(response.StatusCode, response.Content.ReadAsStringAsync().Result);
        }
    }
公共静态异步任务DoPost(字符串路由、对象负载、字符串内容类型)
{
var serializer=新的JavaScriptSerializer();
路由=路由。开始时使用(“/”)路由:“/”+路由;
var content=newstringcontent(serializer.Serialize(有效负载)、Encoding.UTF8、contenttype);
var response=wait client.PostAsync(RequestManager.API_URL+路由,内容);
if(response.StatusCode==HttpStatusCode.OK)
{
var result=await response.Content.ReadAsStringAsync();
返回(R)序列化程序。反序列化(result,typeof(R));
}
其他的
{
抛出新的ResponseException(response.StatusCode、response.Content.ReadAsStringAsync().Result);
}
}

我真的不知道我的错误在哪里,或者请求必须关闭在哪里。

当多个线程试图在同一个文件中写入时,可能会发生此错误。上面的代码只需稍加修改即可工作

  private static object lk = new object();
     lock (lk)
        {
   using (FileStream fs = new FileStream("C:\\New\\" +fileName,FileMode.Create, FileAccess.ReadWrite))
using (StreamWriter str = new StreamWriter(fs))
{
str.Write(jsonFile);
str.Dispose();
str.Close();
 }
  }

Dispose
Close
调用与
using
-语句是多余的。需要更多信息,这可能会被您或任何其他进程锁定。请提供重新创建步骤。例如,这到底叫什么?这是一个多用户、多线程还是web环境?显然,一个文件不能由多个进程同时写入。处理流会关闭该文件。FileStream或IIS没有问题。有数十万个IIS站点可以将数据毫无问题地写入磁盘。但是,您是否试图同时从多个请求写入同一个文件?
fileName
来自哪里?您确定该文件不存在,或者其他请求未使用该文件吗?你想干什么?如果您试图保存上传的文件,为什么不使用ASP.NET自己的方法呢?它们可以工作,但是有两个using语句是没有意义的。在第一个using语句中包装all可以正常工作。如果以前存在并发问题,现在有2^N个-此锁将阻止所有文件写入,无论它们是否尝试写入同一文件。谁说
FileStream
使用的
都坏了?它们每天被成千上万的网站使用数百万次,而不需要额外的锁定。当出现问题时,是代码出了问题。我曾尝试用所有代码示例重现您的问题,但都通过了,除了我尝试并行写入文件时,我通过添加锁解决了问题。如果您在开发计算机上,您可以尝试手动删除该文件并再次测试。添加锁不是解决方案。充其量只是一种掩饰。为什么两个不同的线程试图覆盖同一个文件?锁定或不锁定,其中一个将丢失其数据。最好隐藏异常并继续。在这种情况下,覆盖是错误的。锁定不能解决这个问题。最糟糕的情况是并行处理变成了顺序处理,数据仍然丢失。