C# 定时管理器和辅助线程

C# 定时管理器和辅助线程,c#,.net,multithreading,synchronize,C#,.net,Multithreading,Synchronize,我很难让我的经理和员工正确进行同步。问题是SyncManager在SyncWorker完成之前停止。。。我不知道为什么它不等待SyncWorker完成就继续执行 同步管理器 public void ExecuteTask() { /*设置变量的代码*/ while(fileMetadata.Count>0&&Status!=WorkerStatus.ShouldStop) { if(DateTime.Now.Subtract(lastUpdate.Minutes>1) _WriteEntry(P

我很难让我的经理和员工正确进行同步。问题是SyncManager在SyncWorker完成之前停止。。。我不知道为什么它不等待SyncWorker完成就继续执行

同步管理器
public void ExecuteTask()
{
/*设置变量的代码*/
while(fileMetadata.Count>0&&Status!=WorkerStatus.ShouldStop)
{
if(DateTime.Now.Subtract(lastUpdate.Minutes>1)
_WriteEntry(ProgressString());
if(Status==WorkerStatus.ShouldStop)
打破
同步文件(fileMetadata[0]);
//可能的解决办法
//在单步执行之前,等待同步文件完成(尽管从逻辑上讲它应该这样做)
if(DateTime.Now.Subtract(lastUpdate.Minutes>1)
_WriteEntry(ProgressString());
//我认为导致错误的代码
fileMetadata.RemoveAt(0);
}
/*执行清理操作并通知用户所有传输的代码*/
}
公共void同步文件(FileMetadata fmd)
{
锁(执行锁)
{
尝试++;
长等待时间=0;
开关(类型)
{
案例(SyncManagerType.UploadLarge):
waitTime=8192;
打破
案例(SyncManagerType.UploadMedium):
等待时间=4096;
打破
案例(SyncManagerType.DownloadLarge):
waitTime=8192;
打破
案例(SyncManagerType.DownloadMedium):
等待时间=4096;
打破
违约:
等待时间=30;
打破
}
syncWorker=新文件syncWorker(GenerateSyncWorkerID(),_serviceLog,fmd,ref sb);
syncThread=新线程(新线程开始(syncWorker.ExecuteTask));
syncThread.Start();
DateTime start=DateTime.Now;
日期时间完成;
while(DateTime.Now.Subtract(start).TotalSeconds1)
_WriteEntry(ProgressString());
if(Status==WorkerStatus.ShouldStop)
等待时间=15;
睡眠(1000);
}
finish=DateTime.Now;
睡眠(1000);
if(完成。减去(开始)。总秒数<等待时间)
{
if(syncWorker.Status==WorkerStatus.CompletedSuccess)
{
成功++;
}
}
其他的
{
syncThread.Abort();
sb.AppendLine(“同步管理器(“+ID+”)-FSW(“+syncWorker.ID+”)-Transfer在“+waitTime+”秒之后超时);
}
//可能的解决办法
//FileMetadata toRemove=FileMetadata.Find(委托(FileMetadata f){return f.Equals(syncWorker.FileData);});
//fileMetadata.Remove(删除);
RemoveAll(委托(inti){returni==syncWorker.ID;});
syncWorker=null;
睡眠(1000);
}
}

如果希望父线程等待辅助线程,请确保放置了一个
线程。退出前加入

if (finish.Subtract(start).TotalSeconds < waitTime)
{
     if (syncWorker.Status == WorkerStatus.CompletedSuccess)
     {
          successes++;
     }
}
else
{
     syncThread.Abort();
     syncThread.Join();
     sb.AppendLine("Sync Manager (" + ID + ") - FSW (" + syncWorker.ID + ") - Transfer timed out after " + waitTime + " seconds.");
}
if(finish.Subtract(start).TotalSeconds
问题是,如果只有一个文件需要同步,那么管理器将在线程执行完毕之前关闭,而不是等待线程完成。这似乎是随机发生的,与工作线程是否成功完成无关。@Blaze Phoenix:但是添加连接会迫使管理器等待工作线程。@BlazePhoenix他所说的这是base
join()
method-它将永远等待线程。还有另一个重载版本的
Thread.Join()
,它将等待特定的时间并继续执行-无论线程是否完成工作。感谢我能够使用它来开发解决方案,另一个问题是我锁定了整个方法调用,所以某些其他事件不会发生。