File.AppendAllText() - 进程无法访问该文件,因为它正被另一个进程使用。单线程

时间:2018-04-25 14:07:14

标签: c# .net

目前我写的课程有点问题。我已将其设置为非常有规律地写入文件,但是在单个线程中,当前我遇到错误消息:进程无法访问该文件,因为它正由另一个进程使用。这种情况经常发生但不一致 - 如果我运行足够多次它会破裂但是没有关于何时破裂的模式。

我已经解决了所有常见的罪魁祸首 - 我没有使用任何会返回FileStream的System.Io.File方法,所以在调用之间不需要关闭任何内容。最重要的是,我在一个非常简化的环境中测试一个通用的单线程数据结构类 - 我当然没有故意使用多线程,而且我的调试窗口中没有任何内容建议我也无意中使用它。我正在处理仅为此测试而存在的文件,所以我几乎100%确定没有其他人正在访问它们。

所以我真的有点失落。有关为什么会发生这种情况的任何想法?如果没有,任何关于有效解决方法的建议也将受到赞赏。

简化示例

主要方法:

static void Main(string[] args)
{
    DiskMap<string> testMap = new DiskMap<string>("C:\path");

        for (int i = 0; i < 100000; i++)
        {
            testMap.Add("a" + i, "aa" + i);
        }
}

类别:

public class DiskMap<TValue>
{
    private string path;
    private int loadedDictionaryId;
    private Dictionary<string, TValue> loadedDictionary;

    public DiskMap(string path)
    {
        this.limit = limit;
        this.path = path;
        File.WriteAllText(path + "\\0.txt", "{");
        File.WriteAllText(path + "\\1.txt", "{");

        loadedDictionary = new Dictionary<string, TValue>();
        loadedDictionaryId = 0;
    }

    public void Add(string key, TValue value)
    {
        int dictionaryId = GetId(key); // returns 0 or 1 in this example
        if (dictionaryId == loadedDictId)
        {
            loadedDict.Add(key, value);
        }
        else
        {
            string filePath = this.path + "\\" + dictionaryId + ".txt";
            File.AppendAllText(filePath, JsonConvert.SerializeObject(key) + ":" + JsonConvert.SerializeObject(value) + ","); // It breaks at this line
        }
    }
}

0 个答案:

没有答案