C# WCF服务10s呼叫进行同步
我使用的是Microsoft Sync Framework,每10秒通过WCF服务进行一次同步。在某些系统上,我遇到了奇怪的信号量lexceptions,所以我试图重构这个同步后台线程。 基本上,我的问题是:选择哪种方法:C# WCF服务10s呼叫进行同步,c#,multithreading,wcf,synchronization,microsoft-sync-framework,C#,Multithreading,Wcf,Synchronization,Microsoft Sync Framework,我使用的是Microsoft Sync Framework,每10秒通过WCF服务进行一次同步。在某些系统上,我遇到了奇怪的信号量lexceptions,所以我试图重构这个同步后台线程。 基本上,我的问题是:选择哪种方法: private void SynchronizedWorker() { // Sync loop while (!_shouldStop) { using (var conn = new SqlC
private void SynchronizedWorker()
{
// Sync loop
while (!_shouldStop)
{
using (var conn = new SqlConnection())
{
SyncOrchestrator orchestrator = new SyncOrchestrator();
SqlSyncProviderProxy destinationProvider = new SqlSyncProviderProxy("TEST");
SqlSyncProvider localProvider = new SqlSyncProvider("TEST", conn);
// Set Providers
orchestrator.LocalProvider = localProvider;
orchestrator.RemoteProvider = destinationProvider;
// Direction
orchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
// Sync
orchestrator.Synchronize();
}
// wait for next interval or being woken up
if (_syncWaitEvent.WaitOne(10000))
{
// we have been signaled prior to the timeout expiring
_syncForce = false;
}
}
}
还是这个
SqlConnection conn;
SyncOrchestrator orchestrator = new SyncOrchestrator();
SqlSyncProviderProxy destinationProvider = new SqlSyncProviderProxy("TEST");
SqlSyncProvider localProvider = new SqlSyncProvider("TEST", conn);
private void SynchronizedWorker2()
{
conn = new SqlConnection();
orchestrator = new SyncOrchestrator();
destinationProvider = new SqlSyncProviderProxy("TEST");
localProvider = new SqlSyncProvider("TEST", conn);
// Set Providers
orchestrator.LocalProvider = localProvider;
orchestrator.RemoteProvider = destinationProvider;
// Direction
orchestrator.Direction = SyncDirectionOrder.UploadAndDownload;
// Sync loop
while (!_shouldStop)
{
// Sync
orchestrator.Synchronize();
// wait for next interval or being woken up
if (_syncWaitEvent.WaitOne(10000))
{
// we have been signaled prior to the timeout expiring
_syncForce = false;
}
}
}
为我的每次同步创建新对象似乎是更干净的方法。但当然,它需要稍微多一些cpu时间
您认为呢?我所做的是使用同一个Orchestrator进行同步,但在两种情况下,我正在处理对象(并在需要时重新创建):
- 发生了一个错误
- 应用程序正在退出
我认为这是一种方法…我从未使用过“同步”,但如果这些对象实现IDisposable,那么我强烈建议将它们保留在局部变量中,并使用块实现
。SyncOrchestrator不实现IDisposable,但提供程序实现。但是,由于我使用会话与WCF通信,我可能会让提供者尽可能长时间地保持开放,因为安全协商可能会耗费大量成本。