Информация об изменениях

Сообщение Re[2]: .net core и async lock от 20.02.2021 16:40

Изменено 20.02.2021 17:18 Passerby

Re[2]: .net core и async lock
У меня примерно такая же проблема.
Есть функция сторонней библиотеки
public IDisposable AddMessageHandler<Tmessage>(string messageName, Action<Tmessage> handler)
    {
      return _hubProxy.On(messageName, message =>
      {
        var decoded = DataConverter.Decode<Tmessage>(message);
        handler(decoded);
      });
    }

В ней надо написать свои Action<Tmessage> handler для разных событий, которые определяются string messageName.

При этом разного рода события, таких как получение цен, размещение своих ордеров, в случае если цены удовлетворяют условию , не должны мешать друг-другу, т.е. должны быть асинхронными, но события одни и те же, размещение ордеров, не должны быть одновременными, т.к. после каждого размещения изменяется баланс, значение которого используется при размещении ордеров. Думаю сделать просто: Action<Tmessage> handler для события "open_orders" написать
Action<string> aOrdersOpen = async (message) =>
    {
      await Task.Delay(1);
lock (lockOrdersOpen)  
{
//код
}
}

А для события получения изменений цен
 Action<string, Bittrex> AOrderBook = async (message)=>
{
//есть редко вызываемый, только когда есть совпадение условий await асинхронный метод и без lock, чтобы не мешать одновременному потоку цен 
}

Попробовал, работает. Как происходит распознавание синхронный Action<string> или нет не знаю, одного async недостаточно потому await Task.Delay(1); (можно было и написать Task дальнейшего кода, но так меньше букв). И код работает потому что нет await окончания работы Action, т.е. не вызывается EndInvoke. То что нет вызова EndInvoke у Action это стандарт для событий?
Re[2]: .net core и async lock
У меня примерно такая же проблема.
Есть функция сторонней библиотеки
public IDisposable AddMessageHandler<Tmessage>(string messageName, Action<Tmessage> handler)
    {
      return _hubProxy.On(messageName, message =>
      {
        var decoded = DataConverter.Decode<Tmessage>(message);
        handler(decoded);
      });
    }

В ней надо написать свои Action<Tmessage> handler для разных событий, которые определяются string messageName.

При этом разного рода события, таких как получение цен, размещение своих ордеров, в случае если цены удовлетворяют условию , не должны мешать друг-другу, т.е. должны быть асинхронными, но события одни и те же, размещение ордеров, не должны быть одновременными, т.к. после каждого размещения изменяется баланс, значение которого используется при размещении ордеров. Думаю сделать просто: Action<Tmessage> handler для события "open_orders" написать
Action<string> aOrdersOpen = async (message) =>
    {
      await Task.Delay(1);
lock (lockOrdersOpen)  
{
//код
}
}

А для события получения изменений цен
 Action<string, Bittrex> AOrderBook = async (message)=>
{
//есть редко вызываемый, только когда есть совпадение условий await асинхронный метод и без lock, чтобы не мешать одновременному потоку цен 
}

Попробовал, работает. Как происходит распознавание синхронный Action<string> или нет не знаю, одного async недостаточно потому await Task.Delay(1);. И код работает потому что нет await окончания работы Action, т.е. не вызывается EndInvoke. То что нет вызова EndInvoke у Action это стандарт для событий?