Questa è la mia situazione:uso corretto del 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();
}
Il compito non sarà annullata, quando si chiama il metodo cancelToken. Come mai?
Ho letto il Microsoft guide, un altro StackOverflow domande sulla cancellazione delle attività.
Ma hanno ancora difficoltà a utilizzarli correttamente.
Nel vostro ciclo, sta chiamando un altro metodo asincrono o eseguendo la tua operazione di lunga durata? –
Fornisci un esempio di codice più completo di ciò che stai facendo, ad esempio ciò che viene chiamato ReceiveMessagesFromDeviceAsync? Quale istanza di CancellationToken viene passata in questo metodo? – auburg
Ho effettuato la modifica. – BlueCastle