19.04.2018 Чудеса method overload resolution
 
Привет всем!

Наблюдаю непонятую картину.

В библиотеке имеются такие методы:
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, CancellationToken, Task> subscribeAsync) {...}
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, CancellationToken, Task<IDisposable>> subscribeAsync) {...}
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, CancellationToken, Task<Action>> subscribeAsync) {...}

Пишу вот такое
var sequence =
  Observable.Create<int>( async ( observer, token ) =>
                          {
                            while ( true )
                            {
                              token.ThrowIfCancellationRequested();
                              await Task.Delay( 100, token );
                              observer.OnNext( 0 );
                            }
                          } );

И это не компилируется из-за неоднозначности:
Error    1    The call is ambiguous between the following methods or properties: 
'System.Reactive.Linq.Observable.Create<int>(System.Func<System.IObserver<int>,System.Threading.CancellationToken,System.Threading.Tasks.Task<System.Action>>)' 
and 
'System.Reactive.Linq.Observable.Create<int>(System.Func<System.IObserver<int>,System.Threading.CancellationToken,System.Threading.Tasks.Task>)'

Но если заменить цикл на такой
var sequence =
  Observable.Create<int>( async ( observer, token ) =>
                          {                            
                            while ( false ) // Это единственное отличие
                            {
                              token.ThrowIfCancellationRequested();
                              await Task.Delay( 100, token );
                              observer.OnNext( 0 );
                            }
                          } );

То все компилируется и вызов резолвится в
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, CancellationToken, Task> subscribeAsync) {...}

Что здесь происходит?

19.04.2018 Performance Improvements in .NET Core 2.1
 
Performance Improvements in .NET Core 2.1

private static int[] s_intArray = Enumerable.Range(0, 100_000_000).ToArray();

[Benchmark(OperationsPerInvoke = 100_000_000)]
public int EqualityComparerInt32()
{
    int[] items = s_intArray;

    for (int i = 0; i < items.Length; i++)
        if (EqualityComparer<int>.Default.Equals(items[i], -1))
            return i;

    return -1;
}


On my machine, I get output like the following, showcasing an ~2.5x speedup over .NET Core 2.0:

Method Toolchain Mean
EqualityComparerInt32 .NET Core 2.0 2.2106 ns
EqualityComparerInt32 .NET Core 2.1 0.8725 ns


18.04.2018 Графическая библиотека
 
Коллеги, посоветуйте неспециалисту.

Нужна графическая библиотека для выполнения вот какой задачи:
Есть картинка, jpeg или png
На картинке есть замкнутые регионы неправильной формы, очерченные контуром контрастного цвета.
1) Нужно уметь определять клик внутри такого региона. Нужные активные регионы задаются точкой внутри него.
2) Нужно уметь быстро залить внутренности этих замкнутых регионов нужным цветом при указании точки внутри них. Заливать на самом рисунке необязательно, можно просто получить координаты точек области заливки и закрасить эту область на экране в отдельном слое, не меняя исходную картику.
Желательно, что бы это всё можно было масштабировать.
Все действия на экране, сохранения результата не требуется.

17.04.2018 Как узнать загруженность CPU известным процессом?
 
Всем привет!

Сабж, собственно... Т.е., тот процент, который показывает "Диспетчер задач" в колонке "ЦП"

По Гуглу нарыл вариант считать 2 времени процесса и делить на временной интервал, типа такого:
Stopwatch _stopwatch = new Stopwatch();
...
var process = Process.GetProcessById(<id нужного процесса>)
_stopwatch.Reset();
var begin = process.TotalProcessorTime;
_stopwatch.Start();
Thread.Sleep(1000);
_stopwatch.Stop();
return (process.TotalProcessorTime - begin).TotalMilliseconds / _stopwatch.ElapsedMilliseconds;

врет безбожно

Со счетчиком производительности тоже не прокатывает
Предлагается
var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", process.ProcessName);
return cpuCounter.NextValue();

Но process.ProcessName счетчик не жрет в качестве InstanceName — говорит, не найдено сетевое имя

WMI очень не хочется, есть более другие варианты?
Спасибо...

17.04.2018 Wpf binding
 
Чего то не прокатывает такой биндинг, и не гуглится ничего

<TextBlock Text="{Binding Path=Mas[0].Dt}">
</TextBlock>

Mas — это массив объектов со свойством Dt

17.04.2018 К знатокам Reactive Extensions
 
Привет всем!

Есть асинхронная задача, предназначенная для опроса внешнего ресурса и возвращающая от него результат.
Хотелось бы завернуть последовательность результатов в Observable. Но при этом добиться такого эффекта, чтобы
1. Опрос происходил по таймеру через равные промежутки времени
2. Если Task падает с исключением, выждать некоторое время, по прошествии которого весь процесс опросов перезапускается

Пока что делаю так:
    private static readonly Random random__ = new Random( 123 );
    private static async Task<int> ArbeitAsync()
    {
      await Task.Delay( 100 ); // Jesus is coming, look busy
      const int size = 5;
      var result = random__.Next( size );
      if ( result % size == 0 )
      {
        throw new Exception( "Boom!" );
      }
      return result;
    }

    private static void Main( string[] args )
    {
        const int interval = 1000;

        var sequence = Observable
          .Timer( TimeSpan.Zero, TimeSpan.FromMilliseconds( interval ) ) // Первый опрос идет сразу, дальше через паузу
          .Select( tick => Observable.FromAsync( async () => await ArbeitAsync() ) )
          .Concat()
          .Catch<int, Exception>(
            exception =>
            {
              Console.WriteLine( "{0:hh:mm:ss.fff} Error: {1}", DateTime.Now, exception.Message );
              return Observable
                .Timer( TimeSpan.FromMilliseconds( 3 * interval ), TimeSpan.FromMilliseconds( interval ) ) // Перед первым опросом после восстановления выжидаем подольше, дальше через обычную паузу
                .Select( tick => Observable.FromAsync( async () => await ArbeitAsync() ) )
                .Concat();
            } );
          

        sequence.Subscribe( number =>
                            {
                              Console.WriteLine( "{0:hh:mm:ss.fff} {1}", DateTime.Now, number );
                            },
                            error =>
                            {
                              Console.WriteLine( "{0:hh:mm:ss.fff} Error leaked to subscription: {1}", DateTime.Now, error.Message );
                            } );

        Console.ReadKey();
    }


Но результат получается неожиданный, показан ниже.
Управление попадает в Catch, но ошибка все равно просачивается в подписку, то есть Catch не восстанавливает обычную работу последовательности. Как так?

01:30:31.021 4
01:30:32.018 4
01:30:33.030 3
01:30:34.020 4
01:30:35.052 3
01:30:36.060 Error: Boom!
01:30:37.183 Error leaked to subscription: Boom!

Может кто подскажет где я напортачил?

14.04.2018 как определить primitive or complex property?
 
The property 'Forma_obucheniya' on type 'Aspirant' is not a primitive or complex property. The Property method can only be used with primitive or complex properties. Use the Reference or Collection method

11.04.2018 зависание в Finalize
 
Всем привет!

Есть класс обертка над неуправляемым ресурсом (внутри держится хэндл ресурса), в нём реализован Finalize в котором собственно и происходит закрытие анменеджед ресурса. Что будет если внутри функции закрытия (реализация которой в неуправляемом коде) произойдёт зависание? например код там упрется в бесконечное ожидание мьютекса или чего-то подобного...
Может ли это привести к существенным проблемам со сборкой мусора? особенно такого который никак не связан с этим классом?..

07.04.2018 Зависает консоль core.net
 
Никто не сталкивался с таким явлением — если кликнуть по окну консольного приложения core.net, то консоль перестает отображать информацию.
И как это победить?

05.04.2018 Разнотипные коллекции в коллекции
 
Как вы относитесь к тому, что внутри List<ICollection<T>> будут разные реализации ICollection<T> ?
Например:
var x = new List<ICollection<string>> { new List<string>(), new string[] {"a"} ... }

02.04.2018 SignedXml и кавычки в сертификате
 
Добрый день.

XML-файл подписывается с помощью SignedXml.
При этом в сертификате наименование организации указано в кавычках. Например: "BANK NAME".
В итоге следующий код:
KeyInfoX509Data kiData = new KeyInfoX509Data(certificate);
kiData.AddSubjectName(certificate.Subject);            
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(kiData);


генерирует XML-элемент, в котором кавычки затроились:

<KeyInfo>
<X509Data>
<X509SubjectName>CN=bank.ru, OU=IT Department, O="""BANK NAME"""</X509SubjectName>
</X509Data>
</KeyInfo>


Вопрос такой. Это баг или фича? И не будет ли проблем, если подписанный файл будет обрабатываться не .NET программой?

31.03.2018 Синтаксис Makefile на C#
 
Существует ли библиотека, написанная на C#, для парсинга мэйкфайлов? Хорошо бы чтобы в ней была и обратная операция — генерирование по объектной модели.

Кто-нибудь работал с
https://github.com/Member1221/sharpmake
https://github.com/mathusummut/MakefileMaker
https://github.com/nackdai/makeitso
must be run from Windows, as it uses Visual Studio automation to parse the solution and project files.
https://github.com/ubisoftinc/Sharpmake
примеров бы...

https://stackoverflow.com/questions/18488680/makefile-grammar

29.03.2018 Что сейчас модно использовать для деплоймента?
 
Здравствуйте.

Как-то я отстал от жизни, но, похоже ms инсталляторы типа .vdproj уже вышли из моды.
Начал смотреть в сторону деплоймента с nuget'ом и chocolatey -- как-то непривычно и странно. Т.е. по сути, как я понимаю, используется nuget как репозиторий пакетов, но в то же время можно кастомизировать
с помощью ps скриптов сам процесс инстадяции, который контролируется choco. Не очень понятно как деплоиться в облака, если не будет доступа в локальный репозиторий.
Сейчас изучаю Wix -- вроде старый добрый msi, но не от ms.
Также желательно, чтобы можно было делать новые инсталляторы при автобилде где-нибудь на сервере (wix это умеет) без многочисленных приседаний.

Буду рад любым соображениям, делитесь советами и практикой.

23.03.2018 OutOfMemoryException кто бросил?
 
Есть прожка. На большом объёме данных иногда кидает OutOfMemoryException.
Как узнать, откуда исключение вылетело? Трассировки стека нет.
Кроме как запустить под отладчиком, настроенным на ловлю этого исключения в месте выброса, ничего более не приходит в голову.

18.03.2018 Студия тупит на overload функциях
 
Ребят, привет!

Пользуюсь BLToolkit и возникла проблема, но её корни, чую, лежат вовсе не в библиотеке.
Сразу наглядный пример:

DbManager db;
db.SetCommand("***"). // здесь после точки сразу получаем правильный intellisense, соответствующий типу DbManager

db.SetCommand("***", db.Parameter(***)). // а здесь после точки студия считает, что у меня возвращается object!!


Я что-то перестал понимать в overload'нутых функциях? Возвращаемый тип-то один и тот же! По-моему, это явный баг типизатора C#. Тупят обе студии — VS2015U3 и VS2017v15.6.1; Ну, или я.

15.03.2018 AntiForgeryToken и сохранение данных между запросами
 
Помогите найти название функции mvc framework, или это где-то в коде написано?
есть проект на mvc framework, в котором работа с данными выглядит примерно так:

[HttpGet]
public ActionResult Edit(Guid? id, Guid? ownerId)
{
    // заполнение modeldata, даже в случае если это новый элемент
    // например modelData.Owner = new Owner(){ id = ownerId };
    return View(modelData);
}


[HttpPost]
public ActionResult Edit(ModelType1 data)
{
    bool updating = data.ID != Guid.Empty;
    data.ID = dbService.CreateOrUpdateModelType1(data);

    return Json(data, updating);
}


на вьюхе, ничего про modelData.Owner нету, но есть @Html.AntiForgeryToken()
так вот, когда вызывается POST Edit — data — Owner заполнен данными, которые указаны в GET
подскажите, куда копать? это какая-то магия? я не смог найти этому название в гугле.

12.03.2018 перенаправление вывода из командной строки
 
static void Main(string[] args)
{
            Console.WriteLine("test");
}


параметр запуска "> a.txt"

трассирую, после выполнения
Console.WriteLine("test")


в файле появляется "test". после выхода исчезает и файл блокируется. чего я не доделываю тут?

11.03.2018 Назовите пожалуйста аналог Fuslogvw для mono/linux
 
Уважаемые коллеги,

мировая общественность не может найти ответ на вопрос
https://stackoverflow.com/questions/46249873/mono-mono-options-dll-not-found

я могу добавить немного деталей к описанию:
а) версии Mono.Options которые попадают в директории *-api не такие же как у Mono.Options.dll, которая попадает в GAC
б) если брать .dll-ку из GAC, то она находится и загружается нормально

Чего мне не хватает для счастья:
1) уметь просматривать зависимости .dll имея только её саму.
В выводе утилиты monodis я зависимостей у Mono.Options.dll не вижу.
ну, за исключением
.assembly extern mscorlib
{
.ver 4:0:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
}
2) понять, как узнать что откуда загружается не имея fuzlogvw (потому что linux и mono)

09.03.2018 CsConsoleFormat - Форматирование текста в консоли (.NET)
 
Запилил библиотеку CsConsoleFormat для форматирования текста в консоли.

Имеет удобный синтаксис для раскрашивания, переноса текста, таблиц, списков и ещё кучи всего. Понимает юникодовые символы для переносов, неразрывных пробелов и прочего. Можно рисовать в консоли примитивами и DOS-овскими символами для границ. Дружит с решарпером.

Код писать можно так:
<Document>
    <Span Color="Red">Hello</Span>
    <Br/>
    <Span Color="Yellow">world!</Span>
</Document>


Или так:
new Document(
    new Span("Hello") { Color = ConsoleColor.Red },
    "\n",
    new Span("world!") { Color = ConsoleColor.Yellow }
);


Написано под вдохновением от ConsoleFramework, который написан под вдохновлением от WPF.

Бинарники лежат на NuGet, код покрыт тестами, поддерживается всё от .NET 3.5 до .NET Standard 2.0. Короче, всё как положено.

P.S. Ура! Вернул доступ к старому аккаунту. А я уж думал, что с концами потерял.

P.P.S. Ой, наверное, не в тот форум отправил. Промахнулся.

07.03.2018 WebListener + TLS mutual auth, кто-то пробовал на практике?
 
Коллеги, привет

Нарисовалась задачка на горизонте, срастить WebListener (ака Http sys) и взаимную TLS-аутентификацию клиента и сервера. Кто-то уже имел практический опыт в этой связке? С поднятием своего CA, энроллментом сертификатов и их валидацией — вот это всё. Вопрос простой: встречались ли какие-то грабли/ограничения из-за новизны Net Core? (предположительно, не ниже 2.х) Пока собираюсь копать в сторону Bouncy Castle.