【问题标题】:AsTask doesn't exist to implement a cancellation timeout for Async ReadAsTask 不存在为异步读取实现取消超时
【发布时间】:2014-04-01 01:06:24
【问题描述】:

我渴望在我的stream.ReadAsync() 中添加超时功能,并阅读本文Async Cancellation: Bridging between the .NET Framework and the Windows Runtime (C# and Visual Basic) 中的Microsoft 帮助。本文建议使用AsTask() 来实现这一点。但是我的 C# 似乎根本无法识别 AsTask()

我正在使用 Visual Studio 2013Windows 7 以及 using System.Threading;,这是我拥有的一段代码:

private async Task<int> ReadAsync(BluetoothClient Client)
{
    const int timeoutMs = 10000;
    var cancelationToken = new CancellationTokenSource(timeoutMs);


    var stream = Client.GetStream();
    byte[] buffer = { 0 };
    int offset = 0;
    int count = 1;
    StatusManager("~Async Read Started...");

    //This line works perfectly fine.
    var rx = await stream.ReadAsync(buffer, offset, count);
    //This line gets underlined with error for AsTask()
    var rx = await stream.ReadAsync(buffer, offset, count).AsTask(cancelationToken);
    //rx.AsTask().Start();
    StatusManager("Recieved byte " + rx.ToString());
    StatusManager("~Async Read Finished.");
}

伙计们,我在这里想念什么。我很困惑:)

更新:这些是已安装的 .NET 包列表,我会说 Visual Studio 2013 使用 4.5

【问题讨论】:

  • 您的 .NET 框架版本是多少?
  • 我的项目设置为使用 4.5
  • AsTask 特定于 Windows 运行时。您正在开发 Windows 应用商店应用吗?
  • 一点也不。这是 Windows 桌面软件。 Widows Runtime 是否只能开发 Windows 应用商店应用程序?!
  • @Mehrad,是的,它仅适用于 Windows 应用商店应用程序。对于桌面 .NET 应用程序,您不需要 AsTask

标签: c# .net asynchronous async-await cancellationtokensource


【解决方案1】:

正如@Noseratio 评论的那样,链接文章中的AsTask 用于WinRT 异步操作,而不是BCL 类型。

在您的情况下,您可以直接将取消令牌传递给方法:

var cancelationToken = new CancellationTokenSource(timeoutMs).Token;
...
var rx = await stream.ReadAsync(buffer, offset, count, cancellationToken);

【讨论】:

  • 哇,就在我眼皮底下。坦率地说,我从来不知道 Windows 运行时意味着 = Windows 商店应用程序开发。这解决了这一切。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2013-09-21
  • 2012-08-16
  • 2015-02-05
相关资源
最近更新 更多