Tag: async await

这个异步任务方法有什么问题?

这只是一个简单的异步任务,但我总是遇到奇怪的编译器错误。 此代码来自使用VS2010创建的ASP.NET 4项目中的Web API服务。 甚至ContinueWith(非generics)也会隐式返回Task,但此错误仍然存​​在。 码: public class TestController : ApiController { public Task Test() { string url = “http://www.stackoverflow.com”; var client = new HttpClient(); return client.GetAsync(url).ContinueWith((request) => { // Error 361 ‘System.Threading.Tasks.Task’ does not contain a definition // for ‘Result’ and no extension method ‘Result’ accepting a first argument // of type ‘System.Threading.Tasks.Task’ could […]

实现AsyncCodeActivities(使用C#async / await)

很长一段时间我使用以下模板编写自定义AsyncCodeActivity类: public sealed class MyActivity : AsyncCodeActivity { protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) { var task = new Task(this.Execute, state, CancellationToken.None, TaskCreationOptions.AttachedToParent); task.ContinueWith(s => callback(s)); task.Start(); return task; } protected override T EndExecute(AsyncCodeActivityContext context, IAsyncResult result) { var task = result as Task; if (task.Exception != null) { // Error handling. […]

如何在VS2017 RC中使用新的异步语义?

从Visual Studio 2017 RC发行说明引用 语言扩展和分析器 此版本包括一些我们正在为下一版本的C#和Visual Basic工作的新语言扩展。 默认情况下启用这些新语言function,包括: 对于C#: 异步方法的类似任务的返回类型 :这引入了从异步方法返回任何类似任务类型的能力。 以前这些返回类型被约束为Task和Task 。 它说它默认启用,但我无法让它工作。 甚至从链接的Github页面下载精确的ArbitraryAsyncReturns.zip(并修复对React NuGet包的引用以删除不相关的错误),但是没有安装自定义VSIX包(用于VS2015),我继续得到 错误CS1983:异步方法的返回类型必须为void,Task或Task 我是否需要采取任何额外步骤才能使其正常工作? 我首先尝试将该特定示例缩减为应该起作用的最小版本,但尝试使用它,我还不知道应该起作用什么,不应该起作用。 至少,鉴于这种语言增强,我期待一个虚假的程序,如 struct Test { } static class Program { static async Test Test() { } static void Main() { } } 无法使用不同的错误消息进行编译。 获得相同的错误消息,甚至提示此语言扩展尚未启用,但JaredPar注意到错误消息尚未更新。 我现在将一个所谓的有效示例减少到我认为应该编译的最小版本(但由于未实现的方法而在运行时失败),但是不编译: using System; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace System.Runtime.CompilerServices { public class TasklikeAttribute […]

将任务类型保存为String,导致灾难性故障

我正在尝试将我在Canvas上编写的Ink保存在类中,并使用此链接中的这两种方法重新加载它。 private async Task WriteInk() { using (var stream = new InMemoryRandomAccessStream()) { await inkManager.SaveAsync(stream); await stream.FlushAsync(); stream.Seek(0); byte[] bytes = new byte[stream.Size]; IBuffer buffer = bytes.AsBuffer(); await stream.ReadAsync(buffer, (uint)stream.Size, InputStreamOptions.None); return Convert.ToBase64String(bytes); } } private async void ReadInk(string base64) { if (string.IsNullOrEmpty(base64)) return; var bytes = Convert.FromBase64String(base64); using (var stream = new InMemoryRandomAccessStream()) { […]

在任务中抛出exception – “等待”与等待()

static async void Main(string[] args) { Task t = new Task(() => { throw new Exception(); }); try { t.Start(); t.Wait(); } catch (AggregateException e) { // When waiting on the task, an AggregateException is thrown. } try { t.Start(); await t; } catch (Exception e) { // When awating on the task, the exception […]

重新访问异步void方法的用例

我知道最好的做法是避免除异步事件处理程序之外的任何async void方法,并且对其他用例有很强的专家意见 。 然而,我只是参与了关于async void方法的有用性的简短讨论 ,我有几个问题: 框架如何跟踪挂起的async void方法,包括事件处理程序? 有没有办法获取它们的当前列表或取消它们( 编辑 :可能通过安装自定义SynchronizationContext跟踪)? 它们对火灾和遗忘记录有用吗? 我认为它们实际上可能是,只要在方法开始时保留了正确的时间戳,它仍然可以同步执行。

ASP.NET Web API 2具有Task.Run性能的异步操作方法

我正在尝试使用几个ASP.NET Web API 2.0端点进行基准测试(使用Apache工作台)。 其中一个是同步和一个异步。 [Route(“user/{userId}/feeds”)] [HttpGet] public IEnumerable GetNewsFeedItemsForUser(string userId) { return _newsFeedService.GetNewsFeedItemsForUser(userId); } [Route(“user/{userId}/feeds/async”)] [HttpGet] public async Task<IEnumerable> GetNewsFeedItemsForUserAsync(string userId) { return await Task.Run(() => _newsFeedService.GetNewsFeedItemsForUser(userId)); } 在观看Steve Sanderson的演讲之后,我向每个端点发出了以下命令ab -n 100 -c 10 http://localhost…. 我很惊讶,因为每个端点的基准测试似乎大致相同。 关闭史蒂夫解释说我期待异步端点更高效,因为它会立即将线程池线程释放回线程池,从而使它们可用于其他请求并提高吞吐量。 但数字看起来完全一样。 我在这里误解了什么?

不是.NET 4.0 TPL使APM,EAP和BackgroundWorker异步模式过时了吗?

我有2种C#WPF应用程序项目: 基于.NET 4.0,我无法迁移到.NET 4.5 基于.NET 4.0,我可以迁移到.NET 4.5 所有这些都应该产生2-10个长时间运行(天)进程,这些进程可以被用户取消和重新启动。 我有兴趣遵循最佳设计实践。 首先,现在,我有兴趣消除有关BackgroundWorker用法的歧义,但我希望,我的问题应该对其他异步模式有效。 我看到(矛盾)并发的观点 异步编程模型(APM) 基于事件的异步模式(EAP) 的BackgroundWorker 异步模式: A).NET 4.5使它们过时了 在约瑟夫·阿尔巴哈里的书中,Ben Albahari在“ 过时模式 ”子章节中的“C#5.0 in a Nutshell:The Definitive Reference”中提到了这一点,而其上一版“C#4.0 in a Nutshell:The Definitive Reference”中没有 MSDN文章“使用异步和等待的异步编程(C#和Visual Basic)”告诉: “基于异步的异步编程方法几乎在所有情况下都优于现有方法。特别是,对于IO绑定操作,这种方法优于BackgroundWorker ,因为代码更简单,您无需防范竞争条件。与Task.Run结合使用,异步编程优于BackgroundWorker用于CPU绑定操作,因为异步编程将运行代码的协调细节与Task.Run传输到线程池的工作分开“ B)他们(或者至少是BackgroundWorker )在.NET 4.5中并没有过时 我仍有疑问: 这些模式(首先是BGW)在.NET 4.5中是否已过时? 如果它们在.NET 4.5中已经过时,为什么它们在.NET 4.0中不会过时? 2A)我是否错误地理解.NET 4.0新function在.NET 4.0中仍然“易于”实现/重现?

异步方法不等待

在这个线程中 ,我可以解决我的问题,在构造函数中使用事件等待异步方法。 在这种情况下,事件使用不带参数的委托。 但是现在我需要等待视图模型完成等待异步方法才能继续。 我在主视图模型中有这个代码: public void printMethod() { SecondViewModel mySeocViewModel = new SecondViewModel(myParameter); SecondView mySecondView = new SecondView(); mySecondView.DataContext = mySeocViewModel; //I have to wait until it finished to can print the user control //The problem is that this point is reached before mySecondViewModel finish. } 我的第二个视图模型中的代码: public docFacturasViewModel(MyType parameter) { this.GetDataFromDatabaseEvent += OnGetDataFromDatabase; […]

UWP app:FileOpenPicker PickSingleFileAsync()无法等待

我试图让用户使用FileOpenPicker类浏览文件,但是当我使用PickSingleFileAsync函数等待时,我收到以下错误: ‘IAsyncOperation’不包含’GetAwaiter’的定义,并且没有扩展方法’GetAwaiter’接受类型’IAsyncOperation’的第一个参数可以找到(你是否缺少’System’的using指令?) 这是在最后一行给出错误的函数: private async void browseFileButton_Click(object sender, RoutedEventArgs e) { FileOpenPicker filePicker = new FileOpenPicker(); filePicker.ViewMode = PickerViewMode.Thumbnail; selectedFile = await filePicker.PickSingleFileAsync(); } Microsoft提供的文档包含一个以相同方式使用FileOpenPicker的示例。 有没有人有这个问题或有任何人解决这个问题?