Невозможно вызвать асинхронный и параллельный метод внутри моего консольного приложения asp.net - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть консольное приложение asp.net, и внутри этого консольного приложения я хочу параллельно вызывать асинхронный метод, используя WhenAll, вот основной метод моего консольного приложения:

static void Main(string[] args)
{
    Marketing ipfd = new Marketing();
    try
    {
        using (WebClient wc = new WebClient()) // call the PM API to get the account id
        {
            //code goes here...
        }
    }
    catch (Exception e)
    {
    }
    var tasks = ipfd.companies.Select(c => gettingCustomerInfo(c.properties.website.value)).ToList();
    var results = await Task.WhenAll(tasks);}
}

И вот метод, который я вызываю: -

class Program
{
    static int concurrentrequests = int.Parse(ConfigurationManager.AppSettings["ConcurrentRequests"]);
    SemaphoreSlim throttler = new SemaphoreSlim(initialCount: concurrentrequests);
    int numberofrequests = int.Parse(ConfigurationManager.AppSettings["numberofrequests"].ToString());
    int waitduration = int.Parse(ConfigurationManager.AppSettings["waitdurationmilsc"].ToString());

    private async Task<ScanInfo> gettingCustomerInfo(string website)
    {
        await throttler.WaitAsync();
        ScanInfo si = new ScanInfo();
        var tasks = ipfd.companies.Select(c =>   gettingCustomerInfo(c.properties.website.value)).ToList();
        var results = await Task.WhenAll(tasks);

Но я получаю следующие исключения: -

Оператор 'await' может использоваться только внутри асинхронного метода.Попробуйте пометить этот метод модификатором «async» и изменить его тип возвращаемого значения на «Task»

Ссылка на объект требуется для нестатического поля, метода или свойства »***. Program.gettingCustomerInfo (string) '

Так может кто-нибудь посоветовать по этому поводу?Теперь я знаю, что первое исключение касается того, что сам метод Main не является асинхронным, но если я определю метод main как асинхронный, тогда я получу еще одно исключение, что программа не содержит метод Main, который можно вызвать в качестве конечной точки?

1 Ответ

0 голосов
/ 29 ноября 2018

Есть два способа обойти эту

Предпочтительный вариант

Используйте недавно доступную поддержку async Main, которая доступна с C # 7.1, выполнив следующие действия:шаги:

  • Измените файл проекта для использования C # 7.1 (Свойства -> Построить -> Дополнительно -> Выберите C # 7.1 в качестве языковой версии)

  • Измените ваш метод Main на следующий:

static async Task Main(string[] args) { ... }

Вот пример проекта, демонстрирующий рабочую версию:

https://github.com/steveland83/AsyncMainConsoleExample

Если это интересно, вот неофициальный набор упражнений, которые я написал, чтобы продемонстрировать несколько способов обработки асинхронных задач (и некоторые распространенные основные ошибки): https://github.com/steveland83/async-lab

Вариант 2

Если по какой-либо причине вы не можете использовать описанный выше подход, вы можете принудительно запустить асинхронный код синхронно (будьте осторожны, это почти всегда считается плохой практикой).

var aggregateTask = Task.WhenAll(tasks);
aggregateTask.Wait();
...