Я хочу запустить мой 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. Я не хочу дублировать эту задачу. Что мне делать, пожалуйста, помогите мне.