100分求救关于XML的同时读写问题!在线等

songke 2003-12-28 10:30:38
1、请问当我一个程序用DataSet MyDateTime = new DataSet();
MyDateTime.ReadXml(ModifyGameStateName,XmlReadMode.InferSchema);
正在读入XML的数据时,进行对XML文件的写操作会出错吗?
会的话怎么解决?
2、怎么解决同时写入XML文件的问题?
...全文
23 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
songke 2003-12-29
  • 打赏
  • 举报
回复
是啊,同时写入肯定会出错,所以才要来解决啊。是要用线程还是什么呢
yinleiwudi 2003-12-29
  • 打赏
  • 举报
回复
同时写入的话会出错吧??
songke 2003-12-29
  • 打赏
  • 举报
回复
老大你还没有具体回答我的问题啊
只是教我个写入XML的方法而已。
stlwj 2003-12-29
  • 打赏
  • 举报
回复
我再UP^O^
songke 2003-12-29
  • 打赏
  • 举报
回复
问题还是无法解决,不过得多谢 Lostinet(『 迷失网络 』)的热心帮助。结帐先
Lostinet 2003-12-29
  • 打赏
  • 举报
回复
不过我上面的文件是老版本了。
新版本:
namespace LostinetSample
{
using System;
using System.Collections;
using System.Reflection;
using System.Threading;
using System.Diagnostics;

/// <summary>
/// 使用HashCodeLock.Lock超时
/// </summary>
[Serializable] public sealed class HashCodeLockTimeoutException:Exception
{
internal HashCodeLockTimeoutException(string msg):base(msg){}
}

/// <summary>
/// 针对类型和值的锁
/// </summary>
public sealed class HashCodeLock : MarshalByRefObject
{
int timeout;
bool excep;
/// <summary>
/// 用30秒作为默认过期时间,并且超时引发异常
/// </summary>
public HashCodeLock():this(30000,true)
{
}

/// <summary>
/// 指定默认过期时间,和是否引发异常
/// </summary>
public HashCodeLock(int msTimeout,bool timeoutAsException)
{
timeout=msTimeout;
excep=timeoutAsException;
}

/// <summary>
/// 默认过期时间
/// </summary>
public int DefaultTimeout
{
get
{
return timeout;
}
set
{
timeout=value;
}
}

#region class Allocator
class Allocator
{
class Node
{
Type t;
object o;
public Node(object obj)
{
o=obj;
t=o.GetType();
}
public override bool Equals(object obj)
{
Node n=(Node)obj;
if(t!=n.t)return false;
if(o!=n.o)return false;
return true;
}
public override int GetHashCode()
{
return o.GetHashCode();
}
}

ArrayList al=new ArrayList();
public object Alloc(object obj)
{
object n=new Node(obj);
lock(al.SyncRoot)
{
int index=al.IndexOf(n);
if(index!=-1)
{
n=al[index];
}
al.Add(n);
return n;
}
}
public object Release(object obj)
{
object n=new Node(obj);
lock(al.SyncRoot)
{
int index=al.LastIndexOf(n);
if(index==-1)
throw(new Exception("cant release obj:node not found"));
n=al[index];
al.RemoveAt(index);
return n;
}
}
}
#endregion

#region class InternalLock
class InternalLock:IDisposable
{
HashCodeLock h;
object o;
public InternalLock(HashCodeLock hcl,object obj,int timeout)
{
h=hcl;
o=obj;

object syncobj=hcl.ac.Alloc(obj);
try
{
if(!Monitor.TryEnter(syncobj,timeout))
throw(new HashCodeLockTimeoutException("object : "+o.ToString()+" lock timeout"));
}
catch
{
hcl.ac.Release(obj);
throw;
}

SetStackTrace();
}

string s=" unknown method (not query in release) ";

[Conditional("DEBUG+X")]
void SetStackTrace()
{
try
{
StackTrace st=new StackTrace(4);//skip at lease 3 frame
for(int i=0;i<st.FrameCount;i++)
{
MethodBase mb=st.GetFrame(i).GetMethod();
if(mb.ReflectedType!=typeof(HashCodeLock))
{
s=mb.ReflectedType.FullName+":"+mb.ToString();
return;
}
}
}
catch
{
}
}

public void Dispose()
{
if(h==null)
throw(new Exception("lock at "+s+" already released!"));
Monitor.Exit(h.ac.Release(o));
h=null;
o=null;
}
~InternalLock()
{
if(h!=null)
{
try
{
//回收对象。但无法使用Monitor.Exit
h.ac.Release(o);
//不同的线程了,Monitor.Exit(h.ac.Release(o));不起作用
}
finally
{
throw(new Exception("lock at "+s+" have not released!"));
}
}
}
}
#endregion

#region LockHolder
/// <summary>
/// 用于防止lock(hcl.Lock(xx))的误用
/// </summary>
public struct LockHolder : IDisposable
{
IDisposable dis;
internal LockHolder(IDisposable hee)
{
dis=hee;
}
void IDisposable.Dispose()
{
if(dis!=null)
{
dis.Dispose();
dis=null;
}
}
}
#endregion

#region instance

Allocator ac=new Allocator();

static NothingToDispose Nothing=new NothingToDispose();
class NothingToDispose : IDisposable
{
public void Dispose()
{
}
}

LockHolder CreateLock(object obj,int msTimeout)
{
if(excep)
return new LockHolder(new InternalLock(this,obj,msTimeout));
try
{
return new LockHolder(new InternalLock(this,obj,msTimeout));
}
catch(HashCodeLockTimeoutException)
{
return new LockHolder(null);
}
}

/// <summary>
///
/// </summary>
public LockHolder Lock(object obj)
{
if(obj==null)throw(new ArgumentNullException("obj"));
return CreateLock(obj,timeout);
}
/// <summary>
///
/// </summary>
public LockHolder Lock(object obj,int msTimeout)
{
if(obj==null)throw(new ArgumentNullException("obj"));
return CreateLock(obj,msTimeout);
}
/// <summary>
///
/// </summary>
public LockHolder Lock(object obj,TimeSpan tsTimeout)
{
if(obj==null)throw(new ArgumentNullException("obj"));
return CreateLock(obj,(int)tsTimeout.TotalMilliseconds);
}
#endregion

#region static
static HashCodeLock hcl=new HashCodeLock();
/// <summary>
/// 用于全局的HashCodeLock
/// </summary>
static public HashCodeLock GlobalLock
{
get
{
return hcl;
}
}
#endregion
}
}
Lostinet 2003-12-29
  • 打赏
  • 举报
回复
哦。。补充一下。
锁定的对象必须类型相同并且Equals
所以对于字符串是区分大小写的。
这样就没有问题:
using(filelock.Lock(ModifyGameStateName.ToLower()))
{
}
Lostinet 2003-12-29
  • 打赏
  • 举报
回复
我之前写过一个HashCodeLock,是针对值进行锁定的,
这样就不会有并发冲突。
http://www.lostinet.com/files/
里面的:
http://www.lostinet.com/files/HashCodeLock.cs.txt

使用方法?
你定义一个全局的HashCodeLock:

static public HashCodeLock filelock=new HashCodeLock();

在读写文件时:

using(filelock.Lock(ModifyGameStateName))
{
//在这里读写ModifyGameStateName指定的文件就安全了。
}
速马 2003-12-29
  • 打赏
  • 举报
回复
注意这句代码
FileStream fs = new FileStream(path,FileMode.Open,FileAccess.ReadWrite, FileShare.None);
保证了排他性的读/写
songke 2003-12-29
  • 打赏
  • 举报
回复
没人会吗?自己UP,UP
速马 2003-12-28
  • 打赏
  • 举报
回复
FileStream fs = new FileStream(path,FileMode.Open,FileAccess.ReadWrite, FileShare.None);

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(fs);
songke 2003-12-28
  • 打赏
  • 举报
回复
怎么没人回答啊,思归大侠也不在线上吗?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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