我有一个ObservableObject课程和Swiftui视图.点击按钮时,我创建 Task 并致电populate(一个异步函数)从其中.我认为这将在背景线程上执行populate,但整个UI冻结.这是我的代码: class ViewModel: ObservableObject { @Published var items = [String]() func populate() async { var items = [String]() for i in 0 ..
以下是关于 async-await 的编程技术问答
这是以下问题的后续:为什么在第二个urlsession.shared.datatask之后执行代码,而在初始urlsession.shared.shared.shared.shared.datatask block?datatask的do block? Swift 我正在尝试使用self.variable从类的实例分配变量的当前实例. 这可以从代码行中看到:" self.venues ="在附件代码中的viewcontroller.swift中. 我相信Task与此有关.我已经阅读了有关Task的文档,并且已经在线阅读了有关它的更多信息,但尚未找到解决方案. 另外:我收到错误消息"无法分配'task'task '键入'[venue]'"在代码行开始,以:" self.venues =" in ViewController.swift" . 代码: ViewController.swift: import UIKit import CoreLoca
这是以下问题的后续措施:如何调用可以调用API调用的类的实例,以及在该类中的函数,并将其分配给变量? Swift . 我正在尝试将新的视图控制器推到堆栈上,并从初始视图控制器中呈现此视图控制器,但是当我运行程序时,应在新视图控制器中显示的表视图'T负载在模拟器上.在运行程序之前,之中或之后,我根本没有任何错误通知.另外,似乎并未在此新视图控制器中执行代码,因为新视图控制器类的顶部/非常开头的打印语句(以及视图控制器.swift文件)未打印. 当应该显示新的视图控制器的新表视图时显示的内容是空白屏幕,但是导航栏仍位于顶部,带有导航栏左上方的后退按钮(如通常是在更改为API请求的Yelpapi类并使用异步/等待的Yelpapi类之前正确显示表视图时.发生这种情况时,我也不会在终端中收到任何错误消息. 我认为与问题相关的是新的Yelpapi类,用于在此处在此处发布API端点请求,并使用异步/等待.直到我使用此新类和异步等待的代码进行重构后,这个问题才发生. 我认为可能会
我在背景线程中运行异步函数(以防止阻止主线程)遇到困难. 以下是一种大约需要5秒钟的方法. 从我学到的知识中,似乎可以在函数调用上使用await标记函数async就足够了.但是它无法按预期工作,并且仍然会冻结UI. 编辑 由于据说Swift 5.5并发可以替代调度古事,因此我试图找到一种仅使用异步/等待的方法. edit_2 我确实尝试删除@mainactor包装器,但似乎仍然在主线程上运行. numbermanager.swift @MainActor class NumberManager: ObservableObject { @Published var numbers: [Double]? func generateNumbers() async { var numbers = [Double]() numbers = (1...10_000_000).map { _ in Double.random(
我有一个Windows服务,可以从多个MessageQueue实例中读取.这些消息类都可以运行自己的Task用于读取消息.通常,阅读消息后,完成了I/O数据库的工作.我发现文章声称在I/O操作上使用异步是一个好主意,因为它可以释放线程.我正在尝试模拟在控制台应用程序中使用异步I/O功能的性能提升. 控制台应用程序 在我的测试环境中,我有10个队列. GetQueues()返回10个不同的MessageQueue实例. static void Main(string[] args) { var isAsync = Console.ReadLine() == "Y"; foreach (var queue in queueManager.GetQueues()) { var temp = queue; Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
在我的代码中,我曾经使用await FindAsync加载相关的实体,希望我最好符合C#async指南. var activeTemplate = await exec.DbContext .FormTemplates.FindAsync(exec.Form.ActiveTemplateId); 它的运行缓慢,在SQL Server Profiler中速度很慢,SSMS中的查询文本很快.花了5秒钟才能获取这条线. 替代方案: var activeTemplate = exec.Form.ActiveTemplate; 更快. 一定要说的是,问题似乎不是参数的嗅探,因为快速和慢速查询中的读数是相同的. 一个可能无关的点是,获取的对象包含包含〜1MB文本的字符串属性.该应用程序是ASP.NET MVC,与SQL Server在同一计算机上运行,使用(local)连接. 观察到的缓慢的原因是什么? 编辑: @jbl的评论后,我进行了更多实验:
我正在尝试找到不足CPU的C#服务器应用程序的瓶颈.我认为这可能是由于磁盘i/o性能差,并且与应用程序本身无关,但是我很难用这种假设做出事实. 该应用程序从本地MSMQ队列中读取消息,对每个消息进行一些处理,然后处理消息后,将响应消息发送到另一个本地MSMQ队列. 我正在使用异步循环读取队列中的消息,尽可能快地排出它们,并使用任务派遣它们进行处理.lun以启动每个消息的处理(并且不等待此任务.仅将延续的错误连接到对数字错误).同时处理每个消息,即,在处理下一个消息之前,无需等待一条消息进行完全处理. 在消息的处理结束时,我正在使用messagequeue的发送方法(某种程度上异步,但不是因为它必须等待磁盘写入写入-See system.System.System.Messaging-为什么MessageQueue不提供发送send的异步版本 ). 对于基准测试,我在队列中排队100K消息(约100k消息的总尺寸为100MB),然后启动该程序.在我的两台个人计算机(
我终于得到了VS2012,并进行了一个简单的演示,并努力检查了异步和等待的潜在性能提升,但是令我沮丧的是,它很慢!我可能做错了什么,但也许您可以帮助我. (我还添加了一个简单的螺纹解决方案,并且按预期运行更快) 我的代码基于系统(-1)中的内核数量(-1)有4个内核来概括一个数组,因此我看到大约2速速度(2.5个线程)用于线程,但是2倍慢降低了同一件事,但异步/等待. 代码:(注意您需要添加对System.Management的引用才能使核心检测器正常工作) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Management; using System.Diagnostics; namespace AsyncSu
我们最近开发了一个基于SOA的网站,但是该站点最终在负载下方遇到了可怕的负载和性能问题.我在此处发布了一个问题: asp.net网站在负载下变得无反应 该站点是由API(Web API)站点制成的,该网站托管在4节点群集和一个网站上,该网站托管在另一个4节点群集上,并呼叫API.两者都是使用ASP.NET MVC 5开发的,所有动作/方法均基于异步方法. 在一些监视工具(例如NewRelic)下运行站点后,调查了几个转储文件并分析了工作过程,事实证明,在非常轻的负载(例如16个并发用户)下,我们最终拥有大约900个线程,该线程使用了100个线程100 CPU的百分比并填满了IIS线程队列! 即使我们设法通过引入团队中许多开发人员的堆堆的缓存和绩效修正来将网站部署到生产环境中仅返回操作结果的动作方法. 我个人对方法不满意,因为我的直觉是我们尚未正确使用异步方法,否则这意味着Microsoft引入了一项基本上具有破坏性和无法使用的功能! 您知道有任何参考可
每当我阅读async - await时,用例示例是总是一个UI不想冻结的一个UI.所有编程书/教程都是相同的,或者UI阻止是async - await的唯一情况,我应该知道作为开发人员. 是否有任何例子说明如何使用async - await在算法中删除性能好处?就像让我们做任何经典的编程面试问题: 在二进制树中找到最近的共同祖先 给定a[0],a[1],...,a[n-1]代表基本数字的数字,找到使用相同数字的下一个最高数字 找到两个排序阵列的中位数(即,如果要合并,则中位数) 给定数字数组1,2,...,n丢失一个数字,找到缺失的数字 在数组中找到最大的2个数字 有什么办法可以使用async - await具有绩效好处的方法?如果是这样,如果您只有1个处理器怎么办?那么您的计算机不是只将其时间分配在任务之间,而不是同时完成任务? 解决方案 在在这次采访中,埃里克·利普特(Eric Lippert)将异步与厨师一起做早餐进行了比较.它有助于我了解异步 -
之前,我已经发布了 this 与在客户或服务中应用异步的问题有关的问题.在进行此问题之前,请阅读问题,因为它与问题紧密相结合. 根据答案,我已经测试了C#4.0(TPL)和C#5.0(异步 - 等待)的代码.我正在使用服务提供的方法的异步和同步版本调用服务,并比较每种情况中使用的线程数. 以下是我用来测试使用的资源的代码: 主要方法 List> tasksList = new List>(); List asyncThreads = new List(); List tplThreads = new List(); Stopwatch watch = new Stopwatch(); watch.Start(); // Call the Async version of the method for (int i = 0; i
(只是一个理论问题 - 对于非GUI应用程序) 假设我有很多awaits: public async Task ConsumeAsync() { await A(); await b(); await c(); await d(); //.. } 每个任务可能需要很短的时间, 问题(再次,理论) 可以有与所有"释放后线"和"返回的线程"和"回到返回线程"的总体时间的情况(RED&GREEN在这里:) 比单线要花更多的时间,它可以用少量延迟完成所有工作, 我的意思是,我想成为最有生产力的,但是,由于所有这些来回切换 - 我实际上失去了生产力. 可以发生这种情况吗? 解决方案 a Task对象表示待处理操作的延期结果.如果您没有任何待处理的操作,则不必使用任务和async/await.否则,我相信async/await
我有此功能,该功能从数据库中获取数据. Future reg() async { try { getData().then((value) async { Dio dio = Dio(); Response response = await dio.get( 'http://${value["serverIP"]}:${value["port"]}/${value["passwordMain"]}/reg/${controllerEmail.text}/${controllerPassword.text}/${controllerUsername.text}'); return response; }); } catch (e) {} } 现在我请求数据并检查某些条件检查IF条件). else { var response
我想使用HttpClient获取我的网页的内容. public async Task OnGet() { NetworkCredential credentials = new NetworkCredential(Settings.Username, Settings.Password); using (HttpClientHandler handler = new HttpClientHandler { Credentials = credentials }) using (HttpClient httpClient = new HttpClient(handler)) { Content = await httpClient.GetStringAsync(requestUriString); } return Page(); } 问题是我的using语句导致HttpClient
我正在尝试使用异步和httpclient下载网页,但是只收到一个装满特殊字符的字符串...代码就像.. static async void DownloadPageAsync(string url) { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windo
动机 c#5.0异步/等待结构很棒,不幸的是,微软仅显示了.NET 4.5和VS 2012的释放候选者,这将需要一些时间,直到我们的项目中这些技术将被广泛采用. 在Stephen Toub的 asynchronous方法任务我发现了一个可以在.NET 4.0中很好地使用的替代品.即使在.NET 2.0中,也可以使用该方法,尽管它们似乎很少过时,而且功能较少. 也可以使用该方法. 示例 所以现在我的.NET 4.0代码看起来像(评论的部分显示了在.NET 4.5中如何完成的. //private async Task ProcessMessageAsync() private IEnumerable ProcessMessageAsync() { //var udpReceiveResult = await udpClient.ReceiveAsync(); var task = Task
我一直没有得到护照.在异步/等待或承诺模式的所有内部工作.这是我觉得应该有效的示例,但是它无法执行Passport.authenticate(). const passport = require("passport"); let user; try { user = await __promisifiedPassportAuthentication(); console.log("You'll never have this ", user); } catch (err) { throw err; } function __promisifiedPassportAuthentication() { return new Promise((resolve, reject) => { console.log("I run"); passport.authenticate('local', (err, user
我陷入了异步僵局,我无法弄清楚正确的语法来修复它.我看过几种不同的解决方案,但似乎无法弄清楚是什么原因引起了问题. 我正在使用 parse 作为后端,并尝试使用处理程序写入表.我的处理程序看起来像: public class VisitorSignupHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { //Get the user's name and email address var UserFullName = context.Request.QueryString["name"].UrlDecode(); var UserEmailAddress = context.Request.QueryString["email"].UrlDecode(); //Save the user's inf