C# в VB. net с лямбда-переводом - PullRequest
0 голосов
/ 21 января 2020

Мне нужно перевести следующий вызов с C# на VB. net и хотел бы получить помощь в его переводе.

MyResponse = await Policy.HandleResult<HttpResponseMessage>(message => !message.IsSuccessStatusCode).WaitAndRetryAsync(10, i => TimeSpan.FromSeconds(5), (result, timeSpan, retryCount, context) =>
{
    Debug.WriteLine("Hit Polly Sending Data!");
}).ExecuteAsync(() => myHttpClient.PostAsync(url, myStringContent));

1 Ответ

1 голос
/ 21 января 2020

Обычно сообщество не просто напрямую переводит код для людей, особенно когда существуют такие инструменты, как http://converter.telerik.com/. Но, учитывая, что я вставил ваш код туда и получил что-то, что было не совсем правильно, я вам помогу.

Вы не можете перевести свой код напрямую; вы пропускаете var до MyResponse, иначе MyResponse было объявлено ранее.

Было бы также полезно включить ваши операторы using, особенно если вы используете пакет NuGet Полли , ну, я думаю .

Верно, поэтому импорт C# упрощает задачу

using Polly;
using System;
using System.Net.Http;
using System.Diagnostics;

И делает ее проще на нас! Отформатируйте ваш код немного лучше. Вы дали нам большой двоичный объект, который даже не помещается в один кодовый фрейм

MyResponse = await Policy.HandleResult<HttpResponseMessage>(message => !message.IsSuccessStatusCode).WaitAndRetryAsync(10, i => TimeSpan.FromSeconds(5), (result, timeSpan, retryCount, context) =>
{
    Debug.WriteLine("Hit Polly Sending Data!");
}).ExecuteAsync(() => myHttpClient.PostAsync(url, myStringContent));

, в отличие от этого

var MyResponse = await Policy
    .HandleResult<HttpResponseMessage>(
        message => !message.IsSuccessStatusCode)
    .WaitAndRetryAsync(
        10, 
        i => TimeSpan.FromSeconds(5), 
        (result, timeSpan, retryCount, context) => {
            Debug.WriteLine("Hit Polly Sending Data!");
        })
    .ExecuteAsync(
        () => myHttpClient.PostAsync(url, myStringContent));

Поэтому Telerik переведет этот код в этот VB

Dim MyResponse = Await Policy.HandleResult(Of HttpResponseMessage)(Function(message) Not message.IsSuccessStatusCode).WaitAndRetryAsync(10, Function(i) TimeSpan.FromSeconds(5), Function(result, timeSpan, retryCount, context)
                                                                                                                                                                                                                                    Debug.WriteLine("Hit Polly Sending Data!")
                                                                                                                                                                                                                                End Function).ExecuteAsync(Function() myHttpClient.PostAsync(url, myStringContent))

Красиво отформатировано, именно это

Dim MyResponse = Await Policy.
    HandleResult(Of HttpResponseMessage)(
        Function(message) Not message.IsSuccessStatusCode
    ).
    WaitAndRetryAsync(
        10,
        Function(i) TimeSpan.FromSeconds(5),
        Function(result, timeSpan, retryCount, context)
            Debug.WriteLine("Hit Polly Sending Data!")
        End Function
    ).
    ExecuteAsync(
        Function() myHttpClient.PostAsync(url, myStringContent
    ))

Однако обратите внимание, что в операторе есть предупреждение End Function

Функция '' не возвращается значение на всех путях кода. При использовании результата может возникнуть исключение нулевой ссылки.

Это связано с тем, что переводчик недостаточно умен, чтобы выбрать правильную перегрузку WaitAndRetryAsync. Он выбрал

public static AsyncRetryPolicy<TResult> WaitAndRetryAsync<TResult>(this PolicyBuilder<TResult> policyBuilder, int retryCount, Func<int, TimeSpan> sleepDurationProvider, Func<DelegateResult<TResult>, TimeSpan, Context, Task> onRetryAsync);

, но он должен был выбрать

public static AsyncRetryPolicy<TResult> WaitAndRetryAsync<TResult>(this PolicyBuilder<TResult> policyBuilder, int retryCount, Func<int, TimeSpan> sleepDurationProvider, Action<DelegateResult<TResult>, TimeSpan, int, Context> onRetry);

, которому передано Действие вместо Fun c. Я знаю это, потому что вы звоните Debug.WriteLine, который ничего не возвращает. Вам нужно будет изменить это вручную, что просто. Вот конечный результат, надеюсь ...

Dim MyResponse = Await Policy.
    HandleResult(Of HttpResponseMessage)(
        Function(message) Not message.IsSuccessStatusCode
    ).
    WaitAndRetryAsync(
        10,
        Function(i) TimeSpan.FromSeconds(5),
        Sub(result, timeSpan, retryCount, context)
            Debug.WriteLine("Hit Polly Sending Data!")
        End Sub
    ).
    ExecuteAsync(
        Function() myHttpClient.PostAsync(url, myStringContent
    ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...