我目前正在使用C#开发客户端 - 服务器应用程序。现在在我的客户端,我有一个持续监听服务器响应的线程,在这种情况下是数据。该数据存储在数据表中。现在我有另一个线程,必须使用来自服务器的存储数据访问此数据表并执行一些计算。现在我使用委托设置数据表进行计算,但是我得到了一个异常"集合已被修改。枚举操作可能无法执行。"在计算功能。我已经使用了标志,以便仅在特定计算方法完成计算时设置表,以避免异常但不使用。我怎么能实现上述要求?任何帮助将不胜感激, 提前谢谢。
There is one method here executing continuously Which is Listening for server response say MethodListen:
MethodListen()
{
//Listen To Server
//Get Data sent from server into a temp table
if(flag=true)
{
//Use a delegate to set the MainTable
}
}
Other Method which uses MainTable To execute is executing on a separate thread
MethodCompute()
{
flag=false;
for(//conditions)
{
//table is accessed
}
flag=true;
}
This is the delegate used to set the table:
delegate void SetTableCallback(DataTable dt); //this is used to remove cross thread exception
private void SetTable(DataTable dt_header)
{
try
{
if (this.InvokeRequired)
{
SetTableCallback d = new SetTableCallback(SetTable);
this.Invoke(d, new object[] { dt_header });
}
else
{
consolidated_copy.Clear();
for (int c = 0; c < dt_header.Rows.Count; c++)
{
consolidated_copy.ImportRow(dt_header.Rows[c]);
}
consolidated_copy.AcceptChanges();
}
}
catch(Exception e)
{
//Handle
}
}
答案 0 :(得分:0)
IEnumberable 对修改后的集合进行操作犹豫不决。由于维护了内部版本,因此每当修改列表时,版本都会增加并出现错误并进行比较并抛出错误。并且在这种情况下,您的资源数据表必须在任何时间点仅由单个线程访问,以便给出可修改的非修改集合,以便它( foreach 基本上)可以有效地运行。
现在要解决您的问题,它基本上是一个线程同步问题,因为您没有提供代码,我的猜测是。现在,您可以使用lock,mutex等来避免或解决线程同步问题。 看看这个
答案 1 :(得分:0)
我终于想出了一个解决方案。而不是使用A数据表我使用ConcurrentDictionary来允许跨线程的并发访问,因为我知道在任何时候最多只有两个线程将访问我的字典。我已经添加了我在这里提到的链接以供参考。感谢大家的回答!
https://msdn.microsoft.com/en-us/library/system.collections.concurrent(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/standard/collections/thread-safe/