Tag: async await

SQL CLR等待不执行

我的理解是,当等待从等待返回时,等待完成执行代码的剩余部分。 我试图让它在sql clr中工作,并且这不能用作等待的进程和它下面的代码没有被执行。 在debug方法中,控件只在执行await行后返回。 我怎样才能完成这项工作,因为要求clr在不阻塞主线程的情况下执行,以便其他工作可以在db中继续运行。 我真的需要这个工作,现在已经有2天了。 NB如果方法是同步的,这很有效。 并且存储的proc程序集在sql server中注册为不安全。 我正在使用mssql 2012和visual studio 2015。 public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static async void sp_push_stock_update(SqlString transactionPrimaryKey, SqlString transactionType) { using (SqlConnection conn = new SqlConnection(“context connection=true”)) { StockUpdateClient.stock_fetcher _stockFetcher = new StockUpdateClient.stock_fetcher(conn); List skuList = await new System.Threading.Tasks.Task<List>(()=> _stockFetcher.getItems(transactionPrimaryKey, transactionType)); //Code does not get here performLogging(skuList): […]

从构造函数调用的异步方法

我有一个问题,我在构造函数中调用async方法,如何解决或有一个很好的解决方案,这里是一个例子 public Constructor() { Value = PopulateValueFromDB(); //async method CalculateInDB(); // async method } public async Task PopulateValueFromDB() { … do some async calls return await … } public async Task CalculateInDB() { … return await … } 基本上在构造函数中我有一个错误,因为我不能使用等待那里,我不能使它异步。 对于CalculateInDB我可以使它返回无效,然后我解决它的问题,虽然我读到某处返回void不是很好的解决方案。 关于PopulateVlaue方法……我必须返回一些东西…… 那么是否有一个解决方案,我不应该使用那些方法然后使它们同步而不是异步?

C#异步方法 – 需要帮助

我有一个消耗Web API操作的异步方法。 它似乎陷入了一个循环。 我的理由是因为如果我在catch块的第1行放置一个断点,并且进入,它实际上从未击中第二行。 我最初返回一个包含100,000+(~30mb)行的数据集,并认为由于请求的大小,它可能会很慢,但在更改我的Web API操作以仅返回1行后,问题仍然存在。 当我浏览到Web API解决方案的URI时,肯定会返回数据,我在浏览器中返回了JSON。 public async Task<IEnumerable> GetAll() { try { var response = await _client.GetAsync( string.Format(“{0}/api/document”, _baseURI)); // never hits line below return await response.Content.ReadAsAsync() as IEnumerable; } catch (Exception ex) { // handle exception } } 我不确定我在这里遗失了什么? 一些帮助将不胜感激。 编辑1 在回答一些问题时,我有一个由MVC项目引用的Web API项目。 我必须对JSON反序列化的原始问题进行一些更改。 库: public async Task<IEnumerable> GetAll() { try […]

async / await函数比较

我试图理解async / await,我想知道两种方法是否相同。如果不能解释原因? public async Task GetClient() { return await _clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefaultAsync(); } public Task GetClient2() { return Task.FromResult(_clientRepository.GetAll().Where(x => x.Id == 1).FirstOrDefault()); } public async Task Run() { var result = await GetClient(); var result2 = await GetClient2(); }

如果我使用异步,不应该使用更少的线程数?

我的理解是,如果我使用异步,线程会发出Web请求并继续前进。 当响应回来时,另一个线程从那里接收它。 因此,有较少数量的捆绑线程处于空闲状态。 这是不是意味着最大活线程数会下降? 但在下面的示例中,不使用异步的代码最终使用较少数量的线程。 有人可以解释为什么吗? 没有异步的代码(使用较小的线程): using System; using System.Diagnostics; using System.IO; using System.Net; using System.Threading; namespace NoAsync { internal class Program { private const int totalCalls = 100; private static void Main(string[] args) { for (int i = 1; i <= totalCalls; i++) { ThreadPool.QueueUserWorkItem(GoogleSearch, i); } Thread.Sleep(100000); } private static void GoogleSearch(object […]

在异步方法中捕获exception

我试图更熟悉异步/等待编程和exception处理。 static void Main(string[] args) { TestAsyncException(); } private static async void TestAsyncException() { try { var result = await Task.Factory.StartNew(() => DoSomething()); //do something with the result } catch (Exception e) { Console.WriteLine(e.Message); } } private static int DoSomething() { throw new Exception(“Exception was thrown!”); } 我期待优雅地处理Exception ,但代码执行停止,我得到 在..中发生了’System.Exception’类型的exception,但未在用户代码中处理。 但是当我继续执行代码时, Exception实际上被捕获(并且消息显示给Console )。 如何在不破坏代码执行的Exception下捕获Exception ?

多个异步/等待链接

如何在C#中进行多个异步/等待链接? 例如, 启动几个HTTP请求,然后不要等待所有这些请求,但在每次完成后启动新请求 ?

请解释Timer事件async / await语法

我在这里和这里研究了asynch和await语法。 它真的有助于理解用法,但我在MSDN上找到了一个有趣的语法示例,我只是不明白。 问 :有人可以向我解释一下这个System.Timers.Timer事件注册的语法与asynch await:为什么你可以使用lambda表达式中已经存在的async await关键字? Timer timer = new Timer(1000); timer.Elapsed += async ( sender, e ) => await HandleTimer(); private Task HandleTimer() { Console.WriteLine(“\nHandler not implemented…” ); } 问题2:如果sender没有出现在HandleTimer方法中,那么sender和e的两个参数是什么?

如何正确创建一个等待的方法

我正在写一些等待的方法,我在互联网上找到了很多方法。 所以我来到这里是为了了解每一条路上到底发生了什么,以及是否必须放弃某些方法。 据我所知,有两种等待方法: 那些称其他等待方法的人: public async Task GetFooAsync() { var foo = await TrulyGetFooAsync(); // Do stuff with foo return foo; } 我没有找到任何其他方法来做到这一点,我认为这是正确的方法。 告诉我,如果我错了! 那些只称不可等待方法的人: 这里出现了问题。 例如,我看到了这个: 例1 public async Task GetFooAsync() { return await Task.Run(() => TrulyGetFoo()); } 据我所知,async / await关键字是无用的,可以避免这样做: 例2 public Task GetFooAsync() { return Task.Run(() => TrulyGetFoo()); } 最后一个例子是我到目前为止所做的事情。 关于那,是否有区别: Task.Run(() […]

了解异步和等待

我正在努力学习MVC5的细节,我遇到了令我困惑的事情。 在默认情况下带有Individual Auth的MVC5项目的accountController中,async Login和Register方法中有这行代码 var result = await UserManager.CreateAsync(user, model.Password); 我在这里阅读http://msdn.microsoft.com/en-us/library/hh191443.aspx这是一种常规做法,但我不明白为什么你会使用异步方法并等待同一行。 仅使用在此处采用相同参数的.Create方法是否更有意义?