Dies ist meine Situation:Korrekte Verwendung von CancellationToken
private CancellationTokenSource cancellationTokenSource;
private CancellationToken cancellationToken;
public IoTHub()
{
cancellationTokenSource = new CancellationTokenSource();
cancellationToken = cancellationTokenSource.Token;
receive();
}
private void receive()
{
eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, iotHubD2cEndpoint);
var d2cPartitions = eventHubClient.GetRuntimeInformation().PartitionIds;
foreach (string partition in d2cPartitions)
{
ReceiveMessagesFromDeviceAsync(partition, cancellationToken);
}
}
private async Task ReceiveMessagesFromDeviceAsync(CancellationToken ct)
{
var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
while (true)
{
if(ct.IsCancellationRequested)
{
break;
}
EventData eventData = await eventHubReceiver.ReceiveAsync();
if (eventData == null) continue;
string data = Encoding.UTF8.GetString(eventData.GetBytes());
// Javascript function with Websocket
Clients.All.setMessage(data);
}
}
public void cancelToken()
{
cancellationTokenSource.Cancel();
}
Die Aufgabe wird nicht abgebrochen, wenn die cancelToken Methode aufrufen. Woher?
Ich habe die Microsoft guide gelesen, eine andere Stackoverflow Fragen über Aufgaben Stornierung.
Aber immer noch Schwierigkeiten haben, sie richtig zu verwenden.
In der Schleife, rufen Sie eine andere Asynchron-Methode oder Ihre lang andauernde Operation durchführen? –
Bitte geben Sie ein vollständigeres Codebeispiel von dem, was Sie tun - d. H. Was ruft ReceiveMessagesFromDeviceAsync auf? Welche CancellationToken-Instanz wird in diese Methode übergeben? – auburg
Ich habe den Schnitt gemacht. – BlueCastle