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