FileSqlServerSync/Server/RemoteServer/RemoteSyncServer.cs
ZhaoLei 4724e96efe feat: 增加在各个步骤前后调用扩展命令
c# 异步任务里面的异常,不会在异步之外被捕获。
```
try {

Task.Run(()=>{

throw new Exception()
//此异常不会被捕获

)
};
catch(Exception ex) {
//将不会捕获异常
}
2024-10-29 12:46:13 +08:00

173 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Diagnostics;
using System.Net.WebSockets;
using Common;
namespace RemoteServer;
public class RemoteSyncServer
{
#pragma warning disable CA2211 // Non-constant fields should not be visible
public static string TempRootFile = "C:/TempPack";
public static string SqlPackageAbPath = "SqlPackageAbPath";
#pragma warning restore CA2211 // Non-constant fields should not be visible
private StateHelpBase StateHelper;
public void SetStateHelpBase(StateHelpBase stateHelper)
{
try
{
StateHelper = stateHelper;
if (SyncConfig != null)
{
var LastExec = NotNullSyncConfig.ExecProcesses.Find(x =>
{
return x.StepBeforeOrAfter == "A"
&& x.Step == (stateHelper.Step - 1)
&& x.ExecInLocalOrServer == "S";
});
ExecProcess(LastExec);
var CurrentExec = NotNullSyncConfig.ExecProcesses.Find(x =>
{
return x.StepBeforeOrAfter == "B"
&& x.Step == stateHelper.Step
&& x.ExecInLocalOrServer == "S";
});
ExecProcess(CurrentExec);
}
}
catch (Exception ex)
{
Close(ex.Message);
}
}
public void ExecProcess(ExecProcess? ep)
{
if (ep != null)
{
ProcessStartInfo startInfo =
new()
{
StandardOutputEncoding = System.Text.Encoding.UTF8,
Arguments = ep.Argumnets,
FileName = ep.FileName, // The command to execute (can be any command line tool)
// The arguments to pass to the command (e.g., list directory contents)
RedirectStandardOutput = true, // Redirect the standard output to a string
UseShellExecute = false, // Do not use the shell to execute the command
CreateNoWindow = true // Do not create a new window for the command
};
using Process process = new() { StartInfo = startInfo };
// Start the process
process.Start();
// Read the output from the process
string output = process.StandardOutput.ReadToEnd();
// Wait for the process to exit
process.WaitForExit();
if (process.ExitCode == 0)
{
Pipe.SendMsg(
StateHelper.CreateMsg(
$"{ep.Step}-{ep.StepBeforeOrAfter}-{ep.ExecInLocalOrServer}-{ep.FileName} {ep.Argumnets} 执行成功!"
)
)
.Wait();
}
else
{
Pipe.SendMsg(
StateHelper.CreateMsg(
$"{ep.Step}-{ep.StepBeforeOrAfter}-{ep.ExecInLocalOrServer}-{ep.FileName} {ep.Argumnets} 失败 {output}"
)
)
.Wait();
throw new Exception("错误,信息参考上一条消息!");
}
}
}
public StateHelpBase GetStateHelpBase()
{
return StateHelper;
}
public Config? SyncConfig;
public Config NotNullSyncConfig
{
get
{
if (SyncConfig == null)
{
throw new ArgumentNullException("SyncConfig");
}
return SyncConfig;
}
}
/// <summary>
/// 发布源连接
/// </summary>
public readonly AbsPipeLine Pipe;
/// <summary>
/// 父工程,用于释放资源
/// </summary>
public readonly RemoteSyncServerFactory Factory;
public string Name;
public string Pwd;
public RemoteSyncServer(
AbsPipeLine pipe,
RemoteSyncServerFactory factory,
string name,
string pwd
)
{
Pipe = pipe;
Factory = factory;
Name = name;
Pwd = pwd;
StateHelper = new ConnectAuthorityHelper(this);
}
public async Task Connect()
{
try
{
var rs = Pipe.Work(
(byte[] b) =>
{
return StateHelper.ReceiveMsg(b);
}
);
await foreach (var r in rs) { }
}
catch (Exception e)
{
Close(e.Message);
}
}
public void Close(string? CloseReason)
{
try
{
Pipe.Close(CloseReason);
}
catch (Exception e)
{
//TODO 日志
Console.WriteLine(e.Message);
}
finally
{
Factory.RemoveSyncServer(this);
}
}
}