fajiao
2 years ago
5 changed files with 324 additions and 306 deletions
@ -1,312 +1,317 @@ |
|||
using Cis.Application.Cb; |
|||
using Cis.Application.Cm; |
|||
using Cis.Application.Tb; |
|||
using Microsoft.Extensions.Logging; |
|||
using System.Collections.Concurrent; |
|||
|
|||
namespace Cis.Application.Core; |
|||
|
|||
public class CameraDataCenter |
|||
{ |
|||
#region Attr
|
|||
|
|||
private readonly SqlSugarRepository<CbCamera> _cbCameraRep; |
|||
private readonly SqlSugarRepository<CmMarkLabel> _cmMarkLableRep; |
|||
private readonly SqlSugarRepository<TbPtzCamera> _tbPtzCameraRep; |
|||
private readonly PtzServerApi _ptzServerApi; |
|||
private readonly CameraDataOptions options = App.GetOptions<CameraDataOptions>(); |
|||
|
|||
private Thread _thread { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// (cbCameraId, cbCameraIp)
|
|||
/// </summary>
|
|||
private Dictionary<long, string> _cbCameraId2IpDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cameraIp, TbPtzCamera)
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<string, TbPtzCamera> _tbPtzCameraDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cameraIp, PtzInfo)
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<string, PtzInfo> _cameraPtzInfoDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// _markSearcherDict 锁对象,写锁
|
|||
/// </summary>
|
|||
private static ReaderWriterLockSlim msDictLock { get; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cbCameraId, MarkSearcherBase)
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<long, MarkSearcherBase> _markSearcherDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cameraId, List(MarkLabelCalcResult))
|
|||
/// </summary>
|
|||
|
|||
private ConcurrentDictionary<long, List<MarkLabelCalcResult>> _markLabelCalcResultListDict { get; set; } = new(); |
|||
|
|||
#endregion Attr
|
|||
|
|||
public CameraDataCenter() |
|||
{ |
|||
_cbCameraRep = App.GetService<SqlSugarRepository<CbCamera>>(); |
|||
_cmMarkLableRep = App.GetService<SqlSugarRepository<CmMarkLabel>>(); |
|||
_tbPtzCameraRep = App.GetService<SqlSugarRepository<TbPtzCamera>>(); |
|||
_ptzServerApi = App.GetService<PtzServerApi>(); |
|||
Init(); |
|||
} |
|||
|
|||
private void Init() |
|||
{ |
|||
if (!options.LazyInit) |
|||
{ |
|||
List<TbPtzCamera> list = _tbPtzCameraRep.GetList(); |
|||
// 根据 Ip 去重
|
|||
foreach (TbPtzCamera item in list) |
|||
{ |
|||
if (!_tbPtzCameraDict.ContainsKey(item.Ip)) |
|||
_tbPtzCameraDict[item.Ip] = item; |
|||
} |
|||
} |
|||
|
|||
// 初始化 thread
|
|||
_thread = new Thread(WorkLoop) |
|||
{ |
|||
IsBackground = true// 设置后台线程
|
|||
}; |
|||
_thread.Start(); |
|||
} |
|||
|
|||
#region Loop
|
|||
|
|||
/// <summary>
|
|||
/// 循环运行
|
|||
/// </summary>
|
|||
private void WorkLoop() |
|||
{ |
|||
while (true) |
|||
{ |
|||
RefreshPtzInfoByApi(); |
|||
RefreshMarkSearcher(); |
|||
Thread.Sleep(options.LoopInterval); |
|||
} |
|||
} |
|||
|
|||
private void RefreshPtzInfoByApi() |
|||
{ |
|||
foreach (TbPtzCamera item in _tbPtzCameraDict.Values) |
|||
{ |
|||
PtzInfo ptzInfo = _ptzServerApi.GetPtzInfo(item.CameraId); |
|||
_cameraPtzInfoDict[item.Ip] = ptzInfo; |
|||
} |
|||
} |
|||
|
|||
private void RefreshMarkSearcher() |
|||
{ |
|||
foreach (KeyValuePair<long, MarkSearcherBase> pair in _markSearcherDict) |
|||
{ |
|||
long cameraId = pair.Key; |
|||
MarkSearcherBase markSearcher = pair.Value; |
|||
bool ret = _cbCameraId2IpDict.TryGetValue(cameraId, out string cameraIp); |
|||
if (!ret) continue; |
|||
ret = _cameraPtzInfoDict.TryGetValue(cameraIp, out PtzInfo ptzInfo); |
|||
if (!ret) continue; |
|||
markSearcher.UpdateCameraCalcInfo(ptzInfo); |
|||
List<MarkLabelCalcResult> resultList = markSearcher.Calc(); |
|||
_markLabelCalcResultListDict[cameraId] = resultList; |
|||
} |
|||
} |
|||
|
|||
#endregion Loop
|
|||
|
|||
#region external call
|
|||
|
|||
/// <summary>
|
|||
/// 激活 cbCamera 进入运算
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public bool ActivateSearcher(long cameraId) |
|||
{ |
|||
try |
|||
{ |
|||
msDictLock.EnterWriteLock(); |
|||
if (_markSearcherDict.ContainsKey(cameraId)) |
|||
return false; |
|||
// 获取 cbCamera
|
|||
CbCamera cbCamera = _cbCameraRep.GetById(cameraId); |
|||
if (cbCamera == null) return false; |
|||
// 获取 tbPtzCamera
|
|||
string cameraIp = cbCamera.Ip; |
|||
bool ret = _tbPtzCameraDict.TryGetValue(cameraIp, out TbPtzCamera tbPtzCamera); |
|||
if (!ret) |
|||
{ |
|||
tbPtzCamera = _tbPtzCameraRep.GetFirst(u => u.Ip == cameraIp); |
|||
if (tbPtzCamera == null) return false; |
|||
_tbPtzCameraDict[cameraIp] = tbPtzCamera; |
|||
} |
|||
// 存储 cbCamera id 对应 ip 关系
|
|||
_cbCameraId2IpDict[cbCamera.Id] = cameraIp; |
|||
// 创建 cameraCalcInfo
|
|||
CameraCalcInfo cameraCalcInfo = CameraCalcInfo.New(cameraId, _ptzServerApi.GetPtzInfo(tbPtzCamera.Id)); |
|||
// 创建 markSeacher
|
|||
HikMarkSeacher markSeacher = new(cameraCalcInfo); |
|||
// 获取 cmMarkLabel 列表
|
|||
List<CmMarkLabel> cmMarkLabelList = _cmMarkLableRep.GetList(u => u.CbCameraId == cameraId); |
|||
// 将 cmMarkLabel 一一添加到 markSeacher
|
|||
foreach (CmMarkLabel item in cmMarkLabelList) |
|||
{ |
|||
MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( |
|||
item.Id, |
|||
PtzInfo.New(item.PanPosition, item.TiltPosition, item.ZoomPosition), |
|||
item.VideoWidth, |
|||
item.VideoHeight, |
|||
item.CanvasLeftRatio, |
|||
item.CanvasTopRatio |
|||
); |
|||
markSeacher.AddMarkLabelCalcInfo(markLabelCalcInfo); |
|||
} |
|||
// 将 markSeacher 放入字典
|
|||
_markSearcherDict[cameraId] = markSeacher; |
|||
} |
|||
finally |
|||
{ |
|||
msDictLock.ExitWriteLock(); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 解除 cbCamera 进入运算
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public bool DeActivateSearcher(long cameraId) |
|||
{ |
|||
try |
|||
{ |
|||
msDictLock.EnterWriteLock(); |
|||
_markSearcherDict.Remove(cameraId); |
|||
_markLabelCalcResultListDict.Remove(cameraId); |
|||
} |
|||
finally |
|||
{ |
|||
msDictLock.ExitWriteLock(); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
public bool IsExistSearcher(long cameraId) |
|||
{ |
|||
return _markSearcherDict.ContainsKey(cameraId); |
|||
} |
|||
|
|||
public bool ActivateMarkLabel(long cameraId, long markLabelId) |
|||
{ |
|||
bool ret = _markSearcherDict.TryGetValue(cameraId, out MarkSearcherBase markSearcher); |
|||
if (!ret) |
|||
return false; |
|||
if (markSearcher.ExistsMarkLabelCalcInfo(markLabelId)) |
|||
return false; |
|||
CmMarkLabel label = _cmMarkLableRep.GetById(markLabelId); |
|||
if (label == null) |
|||
return false; |
|||
MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( |
|||
label.Id, |
|||
PtzInfo.New(label.PanPosition, label.TiltPosition, label.ZoomPosition), |
|||
label.VideoWidth, |
|||
label.VideoHeight, |
|||
label.CanvasLeftRatio, |
|||
label.CanvasTopRatio |
|||
); |
|||
return markSearcher.AddMarkLabelCalcInfo(markLabelCalcInfo); |
|||
} |
|||
|
|||
public bool DectivateMarkLabel(long cameraId, long markLabelId) |
|||
{ |
|||
bool ret = _markSearcherDict.TryGetValue(cameraId, out MarkSearcherBase markSearcher); |
|||
return ret ? markSearcher.DeleteMarkLabelCalcInfo(markLabelId) : false; |
|||
} |
|||
|
|||
public bool IsExistCameraMarkLabel(long cameraId, long markLabelId) |
|||
{ |
|||
bool ret = _markSearcherDict.TryGetValue(cameraId, out MarkSearcherBase markSearcher) && |
|||
markSearcher.ExistsMarkLabelCalcInfo(markLabelId); |
|||
return ret; |
|||
} |
|||
|
|||
public List<MarkLabelCalcResult> GetMarkLabelCalcResultList(long cameraId) |
|||
{ |
|||
bool ret = _markLabelCalcResultListDict.TryGetValue(cameraId, out List<MarkLabelCalcResult> list); |
|||
return ret ? list : new(); |
|||
} |
|||
|
|||
public PtzInfo GetCameraPtzInfo(long cameraId) |
|||
{ |
|||
PtzInfo ptzInfo = null; |
|||
bool ret = _cbCameraId2IpDict.TryGetValue(cameraId,out string cameraIp) && |
|||
_cameraPtzInfoDict.TryGetValue(cameraIp, out ptzInfo); |
|||
return ret ? ptzInfo : null; |
|||
} |
|||
|
|||
public async Task<bool> ActivateSearcherAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return ActivateSearcher(cameraId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> DeActivateSearcherAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return DeActivateSearcher(cameraId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> IsExistSearcherAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return IsExistSearcher(cameraId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> ActivateMarkLabelAsync(long cameraId, long markLabelId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return ActivateMarkLabel(cameraId, markLabelId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> DeactivateMarkLabelAsync(long cameraId, long markLabelId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return DectivateMarkLabel(cameraId, markLabelId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> IsExistMarkLabelAysnc(long cameraId, long markLabelId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return IsExistCameraMarkLabel(cameraId, markLabelId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<List<MarkLabelCalcResult>> GetMarkLabelCalcResultListAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return GetMarkLabelCalcResultList(cameraId); |
|||
}); |
|||
} |
|||
|
|||
#endregion external call
|
|||
#region Attr
|
|||
|
|||
private readonly SqlSugarRepository<CbCamera> _cbCameraRep; |
|||
private readonly SqlSugarRepository<CmMarkLabel> _cmMarkLableRep; |
|||
private readonly SqlSugarRepository<TbPtzCamera> _tbPtzCameraRep; |
|||
private readonly PtzServerApi _ptzServerApi; |
|||
private readonly CameraDataOptions options; |
|||
|
|||
private Thread _thread { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// (cbCameraId, cbCameraIp)
|
|||
/// </summary>
|
|||
private Dictionary<long, string> _cbCameraId2IpDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cameraIp, TbPtzCamera)
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<string, TbPtzCamera> _tbPtzCameraDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cameraIp, PtzInfo)
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<string, PtzInfo> _cameraPtzInfoDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// _markSearcherDict 锁对象,写锁
|
|||
/// </summary>
|
|||
private static ReaderWriterLockSlim msDictLock { get; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cbCameraId, MarkSearcherBase)
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<long, MarkSearcherBase> _markSearcherDict { get; set; } = new(); |
|||
|
|||
/// <summary>
|
|||
/// (cameraId, List(MarkLabelCalcResult))
|
|||
/// </summary>
|
|||
|
|||
private ConcurrentDictionary<long, List<MarkLabelCalcResult>> _markLabelCalcResultListDict { get; set; } = new(); |
|||
|
|||
#endregion Attr
|
|||
|
|||
private readonly ILogger<CameraDataCenter> _logger; |
|||
|
|||
public CameraDataCenter() |
|||
{ |
|||
_cbCameraRep = App.GetService<SqlSugarRepository<CbCamera>>(); |
|||
_cmMarkLableRep = App.GetService<SqlSugarRepository<CmMarkLabel>>(); |
|||
_tbPtzCameraRep = App.GetService<SqlSugarRepository<TbPtzCamera>>(); |
|||
_ptzServerApi = App.GetService<PtzServerApi>(); |
|||
options = App.GetOptions<CameraDataOptions>(); |
|||
_logger = App.GetService<ILogger<CameraDataCenter>>(); |
|||
Init(); |
|||
} |
|||
|
|||
private void Init() |
|||
{ |
|||
if (!options.LazyInit) |
|||
{ |
|||
List<TbPtzCamera> list = _tbPtzCameraRep.GetList(); |
|||
// 根据 Ip 去重
|
|||
foreach (TbPtzCamera item in list) |
|||
{ |
|||
if (!_tbPtzCameraDict.ContainsKey(item.Ip)) |
|||
_tbPtzCameraDict[item.Ip] = item; |
|||
} |
|||
} |
|||
|
|||
// 初始化 thread
|
|||
_thread = new Thread(WorkLoop) |
|||
{ |
|||
IsBackground = true// 设置后台线程
|
|||
}; |
|||
_thread.Start(); |
|||
} |
|||
|
|||
#region Loop
|
|||
|
|||
/// <summary>
|
|||
/// 循环运行
|
|||
/// </summary>
|
|||
private void WorkLoop() |
|||
{ |
|||
while (true) |
|||
{ |
|||
RefreshPtzInfoByApi(); |
|||
RefreshMarkSearcher(); |
|||
Thread.Sleep(options.LoopInterval); |
|||
} |
|||
} |
|||
|
|||
private void RefreshPtzInfoByApi() |
|||
{ |
|||
foreach (TbPtzCamera item in _tbPtzCameraDict.Values) |
|||
{ |
|||
PtzInfo ptzInfo = _ptzServerApi.GetPtzInfo(item.CameraId); |
|||
_cameraPtzInfoDict[item.Ip] = ptzInfo; |
|||
} |
|||
} |
|||
|
|||
private async void RefreshMarkSearcher() |
|||
{ |
|||
foreach (KeyValuePair<long, MarkSearcherBase> pair in _markSearcherDict) |
|||
{ |
|||
long cameraId = pair.Key; |
|||
MarkSearcherBase markSearcher = pair.Value; |
|||
bool ret = _cbCameraId2IpDict.TryGetValue(cameraId, out string cameraIp); |
|||
if (!ret) continue; |
|||
ret = _cameraPtzInfoDict.TryGetValue(cameraIp, out PtzInfo ptzInfo); |
|||
if (!ret) continue; |
|||
markSearcher.UpdateCameraCalcInfo(ptzInfo); |
|||
List<MarkLabelCalcResult> resultList = await markSearcher.CalcAsync(); |
|||
_markLabelCalcResultListDict[cameraId] = resultList; |
|||
} |
|||
} |
|||
|
|||
#endregion Loop
|
|||
|
|||
#region external call
|
|||
|
|||
/// <summary>
|
|||
/// 激活 cbCamera 进入运算
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public bool ActivateSearcher(long cameraId) |
|||
{ |
|||
try |
|||
{ |
|||
msDictLock.EnterWriteLock(); |
|||
if (_markSearcherDict.ContainsKey(cameraId)) |
|||
return false; |
|||
// 获取 cbCamera
|
|||
CbCamera cbCamera = _cbCameraRep.GetById(cameraId); |
|||
if (cbCamera == null) return false; |
|||
// 获取 tbPtzCamera
|
|||
string cameraIp = cbCamera.Ip; |
|||
bool ret = _tbPtzCameraDict.TryGetValue(cameraIp, out TbPtzCamera tbPtzCamera); |
|||
if (!ret) |
|||
{ |
|||
tbPtzCamera = _tbPtzCameraRep.GetFirst(u => u.Ip == cameraIp); |
|||
if (tbPtzCamera == null) return false; |
|||
_tbPtzCameraDict[cameraIp] = tbPtzCamera; |
|||
} |
|||
// 存储 cbCamera id 对应 ip 关系
|
|||
_cbCameraId2IpDict[cbCamera.Id] = cameraIp; |
|||
// 创建 cameraCalcInfo
|
|||
CameraCalcInfo cameraCalcInfo = CameraCalcInfo.New(cameraId, _ptzServerApi.GetPtzInfo(tbPtzCamera.Id)); |
|||
// 创建 markSeacher
|
|||
HikMarkSeacher markSeacher = new(cameraCalcInfo); |
|||
// 获取 cmMarkLabel 列表
|
|||
List<CmMarkLabel> cmMarkLabelList = _cmMarkLableRep.GetList(u => u.CbCameraId == cameraId); |
|||
// 将 cmMarkLabel 一一添加到 markSeacher
|
|||
foreach (CmMarkLabel item in cmMarkLabelList) |
|||
{ |
|||
MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( |
|||
item.Id, |
|||
PtzInfo.New(item.PanPosition, item.TiltPosition, item.ZoomPosition), |
|||
item.VideoWidth, |
|||
item.VideoHeight, |
|||
item.CanvasLeftRatio, |
|||
item.CanvasTopRatio |
|||
); |
|||
markSeacher.AddMarkLabelCalcInfo(markLabelCalcInfo); |
|||
} |
|||
// 将 markSeacher 放入字典
|
|||
_markSearcherDict[cameraId] = markSeacher; |
|||
} |
|||
finally |
|||
{ |
|||
msDictLock.ExitWriteLock(); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 解除 cbCamera 进入运算
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public bool DeActivateSearcher(long cameraId) |
|||
{ |
|||
try |
|||
{ |
|||
msDictLock.EnterWriteLock(); |
|||
_markSearcherDict.Remove(cameraId); |
|||
_markLabelCalcResultListDict.Remove(cameraId); |
|||
} |
|||
finally |
|||
{ |
|||
msDictLock.ExitWriteLock(); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
public bool IsExistSearcher(long cameraId) |
|||
{ |
|||
return _markSearcherDict.ContainsKey(cameraId); |
|||
} |
|||
|
|||
public bool ActivateMarkLabel(long cameraId, long markLabelId) |
|||
{ |
|||
bool ret = _markSearcherDict.TryGetValue(cameraId, out MarkSearcherBase markSearcher); |
|||
if (!ret) |
|||
return false; |
|||
if (markSearcher.ExistsMarkLabelCalcInfo(markLabelId)) |
|||
return false; |
|||
CmMarkLabel label = _cmMarkLableRep.GetById(markLabelId); |
|||
if (label == null) |
|||
return false; |
|||
MarkLabelCalcInfo markLabelCalcInfo = MarkLabelCalcInfo.New( |
|||
label.Id, |
|||
PtzInfo.New(label.PanPosition, label.TiltPosition, label.ZoomPosition), |
|||
label.VideoWidth, |
|||
label.VideoHeight, |
|||
label.CanvasLeftRatio, |
|||
label.CanvasTopRatio |
|||
); |
|||
return markSearcher.AddMarkLabelCalcInfo(markLabelCalcInfo); |
|||
} |
|||
|
|||
public bool DectivateMarkLabel(long cameraId, long markLabelId) |
|||
{ |
|||
bool ret = _markSearcherDict.TryGetValue(cameraId, out MarkSearcherBase markSearcher); |
|||
return ret ? markSearcher.DeleteMarkLabelCalcInfo(markLabelId) : false; |
|||
} |
|||
|
|||
public bool IsExistCameraMarkLabel(long cameraId, long markLabelId) |
|||
{ |
|||
bool ret = _markSearcherDict.TryGetValue(cameraId, out MarkSearcherBase markSearcher) && |
|||
markSearcher.ExistsMarkLabelCalcInfo(markLabelId); |
|||
return ret; |
|||
} |
|||
|
|||
public List<MarkLabelCalcResult> GetMarkLabelCalcResultList(long cameraId) |
|||
{ |
|||
bool ret = _markLabelCalcResultListDict.TryGetValue(cameraId, out List<MarkLabelCalcResult> list); |
|||
return ret ? list : new(); |
|||
} |
|||
|
|||
public PtzInfo GetCameraPtzInfo(long cameraId) |
|||
{ |
|||
PtzInfo ptzInfo = null; |
|||
bool ret = _cbCameraId2IpDict.TryGetValue(cameraId, out string cameraIp) && |
|||
_cameraPtzInfoDict.TryGetValue(cameraIp, out ptzInfo); |
|||
return ret ? ptzInfo : null; |
|||
} |
|||
|
|||
public async Task<bool> ActivateSearcherAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return ActivateSearcher(cameraId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> DeActivateSearcherAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return DeActivateSearcher(cameraId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> IsExistSearcherAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return IsExistSearcher(cameraId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> ActivateMarkLabelAsync(long cameraId, long markLabelId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return ActivateMarkLabel(cameraId, markLabelId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> DeactivateMarkLabelAsync(long cameraId, long markLabelId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return DectivateMarkLabel(cameraId, markLabelId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<bool> IsExistMarkLabelAysnc(long cameraId, long markLabelId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return IsExistCameraMarkLabel(cameraId, markLabelId); |
|||
}); |
|||
} |
|||
|
|||
public async Task<List<MarkLabelCalcResult>> GetMarkLabelCalcResultListAsync(long cameraId) |
|||
{ |
|||
return await Task.Run(() => |
|||
{ |
|||
return GetMarkLabelCalcResultList(cameraId); |
|||
}); |
|||
} |
|||
|
|||
#endregion external call
|
|||
} |
@ -1 +1,13 @@ |
|||
Serve.Run(RunOptions.Default.WithArgs(args)); |
|||
Serve.Run(RunOptions.Default.AddWebComponent<WebComponent>().WithArgs(args)); |
|||
|
|||
public class WebComponent : IWebComponent |
|||
{ |
|||
public void Load(WebApplicationBuilder builder, ComponentContext componentContext) |
|||
{ |
|||
// ÈÕÖ¾¹ýÂË
|
|||
builder.Logging.AddFilter((provider, category, logLevel) => |
|||
{ |
|||
return !new[] { "Microsoft.Hosting", "Microsoft.AspNetCore" }.Any(u => category.StartsWith(u)) && logLevel >= LogLevel.Information; |
|||
}); |
|||
} |
|||
} |
Loading…
Reference in new issue