Это моя ситуация:Правильное использование 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();
}
задача не будет отменена, при вызове метода cancelToken. Как так?
Я прочитал Microsoft guide, а также другие вопросы, связанные с отменой задачи.
Но все еще с трудом их правильно использовать.
В вашем цикле, вы вызывать другой метод асинхронного или выполнения вашей длительной работы? –
Просьба предоставить более полный образец кода того, что вы делаете - то есть, что вызывает ReceiveMessagesFromDeviceAsync? Какой экземпляр CancellationToken передается в этот метод? – auburg
Я сделал редактирование. – BlueCastle