C# 对背景工作人员有限制吗?技术或常识

C# 对背景工作人员有限制吗?技术或常识,c#,sql-server,multithreading,replication,backgroundworker,C#,Sql Server,Multithreading,Replication,Backgroundworker,在Program.cs中,我有下面的方法,即检查并将5个SQL db与中央服务器同步。每一个都是独立的,所以我想通过让它们同时运行来加快程序的加载时间 不幸的是,这是非常脆弱的工作一次,然后不是下一次。本地数据库是SQLExpress 2005,中央数据库是SQL Server Standard 2005 这两种连接的数量是否有限制?背景工人呢,我一次只能跑这么多人吗?我相信有一种更为雄辩的方式可以做到这一点,我很想听到(看到)他们 这就是我在Program.cs的Main()中调用它的方式--

在Program.cs中,我有下面的方法,即检查并将5个SQL db与中央服务器同步。每一个都是独立的,所以我想通过让它们同时运行来加快程序的加载时间

不幸的是,这是非常脆弱的工作一次,然后不是下一次。本地数据库是SQLExpress 2005,中央数据库是SQL Server Standard 2005

这两种连接的数量是否有限制?背景工人呢,我一次只能跑这么多人吗?我相信有一种更为雄辩的方式可以做到这一点,我很想听到(看到)他们

这就是我在Program.cs的Main()中调用它的方式-->

if(issqlavable())
SyncNow()


我只用一个

我认为BackgroundWorker可以让我执行一个长时间运行的任务并保持UI的响应性


如果我想要多个线程,我就使用线程池。

你需要更具体地说明“片状”是什么,它是如何表现的。若我理解正确,那个么您正试图在缺少代理支持的情况下手动驱动带有RMO类的合并复制

需要注意的一点是,SQL Express只支持一个调度程序,因此向它添加多个工作进程(挂起的请求)不会有太大的区别,它们只会堆积在可运行队列中,并争夺一个CPU来运行它们


其次,我不确定RMO复制类(我假设您使用的)是否支持在多个并行实例中进行同步,因此我可能没有必要做更多的工作,而不是每db一个BackgroundWorker(在这一点上我可能是错的,我根本不是RMO专家)。

首先,我很抱歉地说,但是你的密码伤害了我的眼睛

整个混乱可以重写如下:

        internal static void SyncNow()
        {
            CreateWorker(new MergeRepl(SystemInformation.ComputerName + "\\SQLEXPRESS", "WWCSTAGE", "aspnetdb", "aspnetdb", "aspnetdb"));
            //etc...
        }

        private static void CreateWorker(MergeRepl repl)
        {
            BackgroundWorker connect = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true };
            connect.DoWork += new DoWorkEventHandler(DoWork);

            if (connect.IsBusy != true)
                connect.RunWorkerAsync(repl);
        }

        private static void DoWork(object sender, DoWorkEventArgs e) 
        { 
            BackgroundWorker worker = sender as BackgroundWorker; 
            try 
            { 
                MergeRepl aspnetdbMergeRepl = e.Argument as MergeRepl;
                aspnetdbMergeRepl.RunDataSync(); 
                areAllInSync += 1; 
            } 
            catch (Exception) 
            { 
                if (worker != null) worker.CancelAsync(); 
            } 
        }

接下来,我将使用线程池进行类似的操作,这将确保只生成特定数量的线程来执行此类工作。

对于初学者,我发现我的While是邪恶的,并导致了一些问题。感谢您为我展示了一种更好的方法。我还没来得及回顾这篇文章,但如果我回顾的话,你的文章将非常有用。这是有道理的。有没有技术原因使您不能使用多个?别担心,我被说服了,这不是一个最佳实践,我只是想知道是否还有其他原因。谢谢BackgroundWorker提供了一种机制,以线程安全的方式在UI和后台任务之间来回传递消息。如果你需要这种交互性,那么一定要使用BackgroundWorkers。如果您不这样做,那么从线程池中旋转一个线程就更简单了(给予或接受并发性问题)。我想“欺骗”。我正在使用RMO并将数据与之同步合并。我以为我可以让他们都跑,但现在看来不是这样。
        internal static void SyncNow()
        {
            CreateWorker(new MergeRepl(SystemInformation.ComputerName + "\\SQLEXPRESS", "WWCSTAGE", "aspnetdb", "aspnetdb", "aspnetdb"));
            //etc...
        }

        private static void CreateWorker(MergeRepl repl)
        {
            BackgroundWorker connect = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = true };
            connect.DoWork += new DoWorkEventHandler(DoWork);

            if (connect.IsBusy != true)
                connect.RunWorkerAsync(repl);
        }

        private static void DoWork(object sender, DoWorkEventArgs e) 
        { 
            BackgroundWorker worker = sender as BackgroundWorker; 
            try 
            { 
                MergeRepl aspnetdbMergeRepl = e.Argument as MergeRepl;
                aspnetdbMergeRepl.RunDataSync(); 
                areAllInSync += 1; 
            } 
            catch (Exception) 
            { 
                if (worker != null) worker.CancelAsync(); 
            } 
        }