WCF的方法响应问题

时间:2011-04-14 13:29:54

标签: sql-server wcf

我有两种方法,首先用于插入数据,第二种用于获取插入数据的当前计数。两者都是WCF服务方法。 我需要在数据库中插入批量记录,所以我想检查插入的记录数。为此,我正在使用我的第二种方法。

但不幸的是,除非第一个过程给予回应,否则不会给出回应。我想独立执行这两种方法。我正在使用支持Ajax的WCF服务。 我无法跟踪我的问题,请帮助我。

感谢。

4 个答案:

答案 0 :(得分:2)

如果您的插入操作在单个事务中起作用,则其他操作无法查看新记录,直到事务完成。

如果你不介意结果不是100%准确和稳定,你可以选择在read uncomitted隔离级别运行select(second)操作。

如果这是不可接受的,你可以将你的进度写入另一个表,每隔几行 - 在一个单独的事务中,(新的非嵌套事务范围), 这样选择操作就可以读取它。

答案 1 :(得分:1)

您是从SQL Server中调用它吗?

为什么不在一个单独的线程中运行批量更新,只需快速返回它已排队并正在处理。

我这样做是为了防止使用太多数据库连接,我只是将数据放入队列中,每隔十秒我处理队列中的任何内容。

然后你的第二个功能可以检查状态。

<强>更新

我有一个静态类来处理,代码就在最后。基本上,调用进来,我立即返回它已成功放入队列。队列只在后台运行,每十秒检查一次并处理其中的任何内容。

我为队列使用ConcurrentQueue,以便我可以同时编写和处理。

因此,您可以使用它来开始更新,然后另一个调用可以查看已处理的数量并返回该信息。

    public string[] UpdateJobs(Jobs[] jobs)
    {
        WebServiceControllerStatic.JobQueue = jobs;
        WebServiceControllerStatic.ProcessUpdateJobQueue();
        List<String> s = new List<String>();
        for (int t = 0; t < jobs.Length; t++)
        {
            s.Add("Success");
        }
        return s.ToArray();
    }

这些在WebServiceControllerStatic类中:

    public static Jobs[] JobQueue
    {
        set
        {
            try
            {
                value.AsParallel().ForAll(i => jobqueue.Enqueue(i));
            }
            catch (Exception e)
            {
                writeToLog("..\r\n" + e.Message + "\r\n" + e.StackTrace);
            }
        }
    }

    public static void ProcessUpdateJobQueue()
    {
        Action UpdateJob = () =>
        {
            if (jobqueue.IsEmpty)
                return;
            Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 1 },
                (j) =>
                {
                    // Do updates here
                });
        };
        if (processUpdateJobThread == null)
        {
            processUpdateJobThread = new System.Threading.Thread(() =>
            {
                while (true)
                {
                    UpdateJob();
                    System.Threading.Thread.Sleep(10000);
                }
            });
            processUpdateJobThread.Start();
        }
    }

答案 2 :(得分:0)

第二个操作在第一个操作完成之前无法完成,您可以为每个批量插入生成操作键,第二个操作可以使用该键获取插入的记录数。

合同应该是这样的:

Guild DoBulkInsert(string commands);

int? GetCount(Guid bulkId);

答案 3 :(得分:0)

@Menahem回答

+1。

此外,您还应该考虑使用SqlBulkCopy而不是逐个插入它们。根据我的经验,这将大大提高性能。