Долгосрочные задачи - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу запустить мой Api Mthod в фоновом режиме и использовать await task.whenall для длительного запуска моего метода. Я хочу запустить этот метод в фоновом режиме. Теперь, когда я запускаю API-вызов приложения из приложения макета, используя javascript, а затем запускаю Задачи в фоновом режиме, используя Task.Whenall (task.toArray ())

Но когда я go в Выполните еще один процесс моего приложения: javascript снова вызовите API из макета и добавьте в Task такие же или дублирующие задачи. Когда все task.array и задачи, выполняющиеся дубликаты. Как я могу управлять. Вот мой код

Код API

var tasks = new List<Task>();
        IHttpActionResult ret = null;
        eventHubClient = EventHubClient.CreateFromConnectionString(IOTHUBSTRING);
        //deviceEntity = listOfDevices.Find((e) => { return e.Id == "IoT_Device2"; });
        CancellationTokenSource cts = new CancellationTokenSource();
        var runtimeInfo = await eventHubClient.GetRuntimeInformationAsync();
        var d2cPartitions = runtimeInfo.PartitionIds;
        foreach (string partition in d2cPartitions)
        {
            tasks.Add(device_data.ReceiveMessagesFromDeviceAsync(partition, cts, eventHubClient));
        }

        await Task.WhenAll(tasks.ToArray());

Метод длительного действия

public static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationTokenSource ct, EventHubClient eventHubClient)
{
    EventHubConsumerGroup group = eventHubClient.GetDefaultConsumerGroup();
    var eventHubReceiver = group.CreateReceiver(partition, EventPosition.FromEnqueuedTime(DateTime.Now));
    Debug.WriteLine("Create receiver on partition: " + partition);
    while (true)
    {
        if (ct.IsCancellationRequested) break;

        Debug.WriteLine("Listening for messages on: " + partition);
        // Check for EventData - this methods times out if there is nothing to retrieve.
        var events = await eventHubReceiver.ReceiveAsync(100, TimeSpan.FromSeconds(10));

        // If there is data in the batch, process it.
        if (events == null) continue;

        foreach (EventData eventData in events)
        {
            string data = Encoding.UTF8.GetString(eventData.GetBytes());
            Debug.WriteLine("Message received on partition {0}:", partition);
            Debug.WriteLine("  {0}:", data);
            Debug.WriteLine("Application properties (set by device):");
            //await eventHubClient.CloseAsync();
        }
    }
}

Javascript код в макете

      <script type="text/javascript">
    $(document).ready(function () {
        var someRootPath = "@Url.Content("~")";
        (function randomGenerator() {
            $.ajax({
        //url: someRootPath + 'TestBlob/GetRandomValue',
      //   //url: "https://localhost:44386/api/DeviceData/getaction",
        //method: 'GET',
                type: "GET",
                url: "/api/signalIR/getData",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
        success: function (data) {
            // $('#pValue').html(data.someValue);
        },
        complete: function () {
            setTimeout(randomGenerator, 1000);
        }
    });
})();
    });
    </script>

Я хочу запустить задачу только один раз, затем автоматически запускать в bakcground. Я не хочу дублировать эту задачу. Что мне делать, пожалуйста, помогите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...