【发布时间】:2020-07-15 00:07:51
【问题描述】:
场景:我想从同步方法调用异步任务,但它是一个独立的任务,我不需要任何返回,我计划控制任务中的所有异常,因此不会启动任何异常。
什么是最好的解决方案来调用它而不会出现死锁并试图花费更少的资源?
例子:
//Sync Method
public MySyncMethod()
{
//Maybe this?
Task.Run(() => KeepAlive(keepAliveSec));
//or this?
KeepAlive(keepAliveSec).GetAwaiter();
//Any other better option?
}
/// <summary>
/// Starts Heartbeat, Async Task
/// </summary>
/// <param name="sec"></param>
/// <returns></returns>
public async Task KeepAlive(int sec)
{
try
{
while (!CancelationToken.IsCancellationRequested)
{
if ((DateTime.Now - LastMessageDate).Seconds<sec)
{
SendMessage(new MessageV4() { MsgType = MsgTypeEnum.HeartBeat });
}
await Task.Delay(60000);
}
}
catch (Exception ex)
{
//Just do what you want to control any Exception
Log.Debug(ex);
}
}
PS - 我之前在这里搜索过,但仍然没有找到明确的答案
【问题讨论】:
-
CancellationToken 来自哪里?
-
否,因为如果没有发送,构造函数会构建一个默认值。
-
为什么
MySyncMethod需要同步? -
@RuiCaramalho 你想在构造函数中调用它吗?如果是这样,那么有比阻塞或即发即弃更清洁的解决方案。
-
您想每隔
X秒发送一些消息以保持...某些...活着,并且您不想阻塞主线程?有什么理由不使用System.Threading.Timer?
标签: c# asynchronous