txt写入时出现:正由另一进程使用,因此该进程无法访问该文件,有没有好的解决方法

鏡椛氹鈅 2015-07-23 09:47:01

for (int i = 0; i < 10000; i++)
{
using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
{
sw.WriteLine(i.ToString() + "\r");
}
}

上面这段代码,写入数据时,会发生 5.txt正由另一进程使用,因此该进程无法访问该文件.
各位大神,有没有好的解决办法...
...全文
846 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
油条泡胡辣汤 2017-06-02
  • 打赏
  • 举报
回复
刚也出现了同样的情况,GOTO的方式可以解决,但用着着实别扭 更新下现在的解决办法 详见http://blog.csdn.net/sundacheng1989/article/details/14520957 使用FileShare解决
xuzuning 2015-07-24
  • 打赏
  • 举报
回复
单线程时,你肯定会可以避免出现这种情况 但是在多线程时,你该如何处理呢? 显然是在 catch 分支中尝试重入

            loop:
            try
            {
                var a = new StreamWriter("1.txt", true);
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex.Message.ToString());
                sleep(10);
                goto loop;
            }
xuzuning 2015-07-24
  • 打赏
  • 举报
回复
            try
            {
                var a = new StreamWriter("1.txt", true);
                var b = new StreamWriter("1.txt", true);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
只要目标文件是同一个,则就会发生异常 何况你还是在多线程模式下工作
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 1 楼 johnliuyuan 的回复:
把循环放到using语句的里面
这是一个日志输出的功能功能,所以不可能将循环放到Using里面...
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 14 楼 piaopiao_lucky 的回复:
我这里测试没问题啊,可以使用using啊
麻烦看下9楼的回复...
  • 打赏
  • 举报
回复
我这里测试没问题啊,可以使用using啊
  • 打赏
  • 举报
回复
然后再看你有什么程序用了独占式在读取这个文件?
  • 打赏
  • 举报
回复
把循环写到using里面吧。。。现在你每次循环都建一个。
ajianchina 2015-07-24
  • 打赏
  • 举报
回复
引用 10 楼 u012804018 的回复:
[quote=引用 6 楼 ajianchina 的回复:] 用了using,但并没有在下一次循环到来之前释放资源,你应该在当前循环内写完后调用Close关闭流及所占资源。

for (int i = 0; i < 10000; i++)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
        sw.Close();
    }
}
只用sw.Close没用的你看Using的用法https://msdn.microsoft.com/zh-cn/library/yh598w02.aspx [/quote] 我注意到StreamWriter为了优化性能他会在内存中缓存据,所以释放资源前调用Flush(),确保所有的数据都写到了磁盘上。
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 6 楼 ajianchina 的回复:
用了using,但并没有在下一次循环到来之前释放资源,你应该在当前循环内写完后调用Close关闭流及所占资源。

for (int i = 0; i < 10000; i++)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
        sw.Close();
    }
}
只用sw.Close没用的你看Using的用法https://msdn.microsoft.com/zh-cn/library/yh598w02.aspx
鏡椛氹鈅 2015-07-24
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
实际上,你的代码在我这里不会报bug。写10000条数据也不出错。 你可以试试
 using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
  {
               sw.WriteLine(i.ToString() + "\r");
               sw.Close();
  }
这或许就能解决你的问题。
这个确实在单独的执行的时候不会报错,我把他放到WindowsServic里面就会报错... 代码 protected override void OnStart(string[] args) { System.Timers.Timer t = new System.Timers.Timer(100); t.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed); t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; } private void Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { for (int i = 0; i < 10000; i++) { using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true)) { sw.WriteLine(i.ToString() + "\r"); sw.Close(); } } } catch (Exception ex) { using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\6.txt", true)) { sw.WriteLine(ex.Message.ToString() + "\r"); sw.Close(); } } } 这样写就会报错,和应该和Timer 没有关系,在Form下面用Timer是不会报错的...
ajianchina 2015-07-23
  • 打赏
  • 举报
回复
发完居然发现被大牛抢先了
ajianchina 2015-07-23
  • 打赏
  • 举报
回复
用了using,但并没有在下一次循环到来之前释放资源,你应该在当前循环内写完后调用Close关闭流及所占资源。

for (int i = 0; i < 10000; i++)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
        sw.Close();
    }
}
  • 打赏
  • 举报
回复
实际上,你的代码在我这里不会报bug。写10000条数据也不出错。 你可以试试
 using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
  {
               sw.WriteLine(i.ToString() + "\r");
               sw.Close();
  }
这或许就能解决你的问题。
  • 打赏
  • 举报
回复
嗯,改一下:
for (int i = 0; i < 10000; i++)
{
    for (var j = 0; j < 5; ++j)
    {
        try
        {
            NewMethod(i);
        }
        catch
        {
            if (j >= 4)
                throw;
        }
    }
}
一般来说,这种代码不会刻意去重试(这里重试了4遍)。程序的最终的架构改变以测试为准,如果测试发现一个实际的系统有这类问题,那么往往就修改程序架构了。例如一个又要不断写入数据又要被读取的文件,它就不是这样的“不断close”的了。
  • 打赏
  • 举报
回复
对于这类无法事先捕获异常状况的代码,你可以使用“重试”的方式来操作。例如
private static void NewMethod(int i)
{
    using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true))
    {
        sw.WriteLine(i.ToString() + "\r");
    }
}
for (int i = 0; i < 10000; i++)
{
    for (var j = 0; j < 5; ++j)
    {
        try
        {
            NewMethod(i);
        }
        catch
        {
            if (j >= 5)
                throw;
        }
    }
}
alwcelcs 2015-07-23
  • 打赏
  • 举报
回复
StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @"\5.txt", true);
            for (int i = 0; i < 10000; i++)
            {
                    sw.WriteLine(i.ToString() + "\r");
            }
            sw.Flush();
            sw.Close();
john_QQ:2335298917 2015-07-23
  • 打赏
  • 举报
回复
把循环放到using语句的里面
在工业生产实践中,零部件的几何精度检测直接决定了产品质量的稳定性和制造流程的效能。随着自动化技术的演进,基于机器视觉的检测方法已广泛融入工业计量体系,成为实现高效、精密测量的核心技术路径。这类系统通过仿照人眼的信息摄取机制,并与计算机运算能力相结合,可自主完成影像的解析与处理,进而获取零部件的准确尺寸数据。 本测量系统的研发宗旨,在于提升工业质量检测的执行效率与测量精度。其设计使其能够同支持圆形与矩形两类常见几何形状的标定与尺寸判定,因此具备较强的通用性,可适应大多数标准工业部件的检测任务。为了实现上述功能,系统采用白色A4纸作为图像采集的基底材料。白色的背景环境有助于强化图像处理过程中的边缘识别与对比度优化,从而改善最终测量的准确程度。同,摄像头被选作图像输入端设备,这赋予了测量过程更高的部署灵活性,使其便于接入现有的生产线体系。 在硬件结构得到优化的基础上,该平台还采用了一系列改进型算法对采集到的影像数据进行深度解析,以完成高精度的尺寸换算。考虑现实操作中可能存在的多种误差因素,设计者额外引入了系统性误差分析机制。通过对误差的来源进行辨识与补偿,系统有效改善了输出结果的稳定性与可信度。这种对尺寸计算的严格要求以及误差的精细调控,为提升整体产线上的品质控制能力奠定了坚实基础。 就系统运行的管理层面而言,除技术性能优势外,本方案还集成了用户身份验证与操作权限控制体系。这一设计反映出对工业信息安全问题的关注,借助分级权限的设置,确保仅有获得授权的人员可以执行操作或读取敏感数据,以此维护系统的运行安全和数据信息的私密性。在现代工业企业中,这种做法尤为重要,能够有效防范因违规操作或信息泄露所引发的运营风险与资产损失。 综上所述,该工业零件尺寸自动测量系统凭借自动化作业、高测量精度以及严密的信息保护能力,极大优化了质量检测的工作效能与成果质量,并为现代工业生产提供了一套先进且稳健的解决方案,适用于各类规模及不同用途的工业质量管理场景。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
内容概要:本文围绕基于去噪概率扩散模型(DDPM)的电动汽车充电行为场景生成展开研究,旨在通过Python与PyTorch实现顶级EI论文的复现工作。研究重点在于利用DDPM这一先进的生成式模型对电动汽车用户的充电行为进行高精度建模与多样化场景生成,充分考虑用户行为的随机性与不确定性,从而提升电力系统中负荷预测、需求响应策略制定及电网调度决策的准确性与鲁棒性。文中系统阐述了DDPM的基本理论框架,包括正向扩散过程、反向去噪机制、损失函数设计与采样策略,并详细介绍了适用于间序列数据的网络结构设计(如基于UNet的间编码架构)、训练流程优化及超参数设置。结合真实或合成的电动汽车充电数据集,实验部分验证了该方法在生成具有高度真实感的充电负荷曲线方面的优越性能,展现出其在复杂能源系统仿真中的应用潜力。; 适合人群:具备扎实的Python编程能力、熟悉深度学习基本原理及PyTorch框架使用的科研人员,尤其适用于从事电力系统分析、智能交通、新能源汽车、能源互联网等领域研究的硕士、博士研究生以及高校或企业研发机构的科研工作者。; 使用场景及目标:①用于高水平EI/SCI论文中关于交通-能源耦合系统场景生成方法的复现与验证;②为电动汽车充电负荷预测、电网侧需求响应模拟、配电网络规划及储能配置优化等研究提供高质量、多样化的输入场景数据;③推动生成式人工智能技术在能源系统建模与仿真中的深度融合与创新应用。; 阅读建议:建议读者在学习过程中结合所提供的完整代码深入理解DDPM在间序列生成任务中的具体实现细节,重点关注数据预处理流程、模型训练稳定性技巧、噪声调度策略的选择以及生成结果的统计特性评估方法,鼓励在此基础上拓展至其他类型的行为建模或跨领域应用场景。

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧