需要跨线程访问数据表数据

时间:2018-02-08 06:15:19

标签: c# .net

我目前正在使用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
        }
}

2 个答案:

答案 0 :(得分:0)

IEnumberable 对修改后的集合进行操作犹豫不决。由于维护了内部版本,因​​此每当修改列表时,版本都会增加并出现错误并进行比较并抛出错误。并且在这种情况下,您的资源数据表必须在任何时间点仅由单个线程访问,以便给出可修改的非修改集合,以便它( foreach 基本上)可以有效地运行。

现在要解决您的问题,它基本上是一个线程同步问题,因为您没有提供代码,我的猜测是。现在,您可以使用lock,mutex等来避免或解决线程同步问题。 看看这个

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/threading/thread-synchronization

答案 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/