Questions tagged «c#-5.0»

对于与使用C#5.0版进行开发有关的问题。

24
如何同步运行异步Task <T>方法?
我正在学习异步/等待,并遇到需要同步调用异步方法的情况。我怎样才能做到这一点? 异步方法: public async Task&lt;Customers&gt; GetCustomers() { return await Service.GetCustomersAsync(); } 正常用法: public async void GetCustomers() { customerList = await GetCustomers(); } 我尝试使用以下方法: Task&lt;Customer&gt; task = GetCustomers(); task.Wait() Task&lt;Customer&gt; task = GetCustomers(); task.RunSynchronously(); Task&lt;Customer&gt; task = GetCustomers(); while(task.Status != TaskStatus.RanToCompletion) 我也从这里尝试了一个建议,但是当调度程序处于挂起状态时,它不起作用。 public static void WaitWithPumping(this Task task) { if (task …

5
对多个任务使用异步/等待
我使用的是完全异步的API客户端,也就是说,每个操作要么返回Task要么Task&lt;T&gt;,例如: static async Task DoSomething(int siteId, int postId, IBlogClient client) { await client.DeletePost(siteId, postId); // call API client Console.WriteLine("Deleted post {0}.", siteId); } 使用C#5 async / await运算符,启动多个任务并等待所有任务完成的正确/最有效方法是什么: int[] ids = new[] { 1, 2, 3, 4, 5 }; Parallel.ForEach(ids, i =&gt; DoSomething(1, i, blogClient).Wait()); 要么: int[] ids = new[] { …

3
您是否必须将Task.Run放入一个使它异步的方法中?
我试图以最简单的形式理解异步等待。为了这个示例,我想创建一个非常简单的方法,将两个数字相加,这是完全没有时间的,这只是在此处举例说明而已。 例子1 private async Task DoWork1Async() { int result = 1 + 2; } 例子2 private async Task DoWork2Async() { Task.Run( () =&gt; { int result = 1 + 2; }); } 如果我等待DoWork1Async(),代码将同步还是异步运行? 是否需要包装同步代码Task.Run以使该方法可以等待和异步,以免阻塞UI线程? 我试图弄清楚我的方法是a Task还是return Task&lt;T&gt;,是否需要包装代码Task.Run以使其异步。 我确定是愚蠢的问题,但我在网上看到的示例中,人们正在等待代码,这些代码中没有异步内容并且没有包装在Task.Runor中StartNew。

3
如何在C#中创建异步方法?
我读过的每篇博客文章都告诉您如何使用C#使用异步方法,但是出于某些奇怪的原因,请不要解释如何构建自己的异步方法来使用。因此,我现在拥有使用我的方法的这段代码: private async void button1_Click(object sender, EventArgs e) { var now = await CountToAsync(1000); label1.Text = now.ToString(); } 我写的这个方法是CountToAsync: private Task&lt;DateTime&gt; CountToAsync(int num = 1000) { return Task.Factory.StartNew(() =&gt; { for (int i = 0; i &lt; num; i++) { Console.WriteLine("#{0}", i); } }).ContinueWith(x =&gt; DateTime.Now); } 这是使用Task.Factory,是编写异步方法的最佳方法,还是应该以其他方式编写?
196 c#  async-await  c#-5.0 

4
C#5异步CTP:为什么在EndAwait调用之前在生成的代码中将内部“状态”设置为0?
昨天,我在谈论新的C#“异步”功能,特别是深入研究了生成的代码和the GetAwaiter()/ BeginAwait()/ EndAwait()调用。 我们详细研究了C#编译器生成的状态机,其中有两个我们无法理解的方面: 为什么生成的类包含一个Dispose()方法和一个$__disposing变量,而它们似乎从未被使用过(而该类未实现IDisposable)。 为什么在state调用之前将内部变量设置为0 EndAwait(),通常0表示“这是初始入口点”。 我怀疑可以通过在async方法中做一些更有趣的事情来回答第一点,尽管如果有人有更多的信息,我很乐意听到。但是,这个问题更多地是关于第二点的。 这是一个非常简单的示例代码: using System.Threading.Tasks; class Test { static async Task&lt;int&gt; Sum(Task&lt;int&gt; t1, Task&lt;int&gt; t2) { return await t1 + await t2; } } ...这是为MoveNext()实现状态机的方法生成的代码。这是直接从Reflector复制的-我还没有解决难以形容的变量名: public void MoveNext() { try { this.$__doFinallyBodies = true; switch (this.&lt;&gt;1__state) { case 1: break; case 2: goto …
195 c#  asynchronous  c#-5.0 

6
是否存在与Process.Start异步的等效项?
如标题所示,是否有Process.Start我可以等待的等效项(允许您运行其他应用程序或批处理文件)? 我正在玩一个小型控制台应用程序,这似乎是使用异步和等待的理想场所,但我找不到这种情况的任何文档。 我在想的是以下几方面的东西: void async RunCommand() { var result = await Process.RunAsync("command to run"); }
141 c#  async-await  c#-5.0 

5
在.net 4上使用async-await
我目前正在开始创建一个将从C#5的async-await功能中受益匪浅的应用程序。但是我不确定要使用哪个版本的VS和异步运行时。 查看OS流行度图表,我需要再支持Windows XP三年左右。看起来.net 4.5仅在更新版本的Windows上运行,因此我需要定位.net 4.0。开发机器使用Windows 7,因此使用较新版本的VS没问题。 现在,我需要首先选择一个编译器来执行此操作: 带有AsyncCTP的VS2010 VS2012预览版(到达后即为最终版本),将目标设置为.net 4.0 Mono(看起来像2.12具有async-await,我更喜欢/ am习惯于使用VS取代MonoDevelop作为IDE) 哪一个代码错误较少?在Jon Skeet的博客中,VS2012 Preview使用的永远不会是CTP的代码生成器。 更重要的是要使用哪个运行时? VS2012是否包含可与.net 4一起使用的可重新分发的异步运行时? 通过引用AsyncCTP运行时,我设法通过预览来编译代码。但是,由于CTP具有奇怪的许可条件,因此这似乎不是一个好的长期解决方案。 还是应该使用第三方实现?也许单声道有一个? 为了分发库,我更喜欢将dll与应用程序放在同一目录中,而不是某种安装程序。 如果我的二进制文件可以在mono + Linux / MacOS上运行而无需更改,我也很喜欢。因此,运行时应该与内置的mono(可能为2.12)兼容,或者允许在非Windows操作系统上使用。

6
如何在Visual Studio 2015中禁用C#6支持?
背景 我们有一个在VS 2015中启用C#6的项目,开发人员有时需要使用不带C#6的VS 2013来打开该项目。 我们无意在此特定解决方案中使用C#6(正如我所希望的那样)。 问题 Visual Studio和ReSharper建议使用有用的C#6语言构造,这些构造会使解决方案在没有C#6支持的早期版本的Visual Studio中无法使用。 我已禁用ReSharper C#6支持,但似乎无法在整个解决方案中禁用/限制C#功能。 题 如何在解决方案中或Visual Studio 2015中将C#限制为C#5功能?

2
如何实现异步动作委托方法?
一点背景资料。 我正在学习Web API堆栈,并且正在尝试以带有诸如Success和ErrorCodes之类的参数的“结果”对象的形式封装所有数据。 但是,不同的方法将产生不同的结果和错误代码,但是结果对象通常将以相同的方式实例化。 为了节省时间并进一步了解C#中的异步/等待功能,我试图将Web api操作的所有方法体包装在异步操作委托中,但遇到了一些麻烦... 给定以下类别: public class Result { public bool Success { get; set; } public List&lt;int&gt; ErrorCodes{ get; set; } } public async Task&lt;Result&gt; GetResultAsync() { return await DoSomethingAsync&lt;Result&gt;(result =&gt; { // Do something here result.Success = true; if (SomethingIsTrue) { result.ErrorCodes.Add(404); result.Success = false; } …

2
Task <int>如何变成int?
我们有这种方法: async Task&lt;int&gt; AccessTheWebAsync() { HttpClient client = new HttpClient(); Task&lt;string&gt; getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); // You can do work here that doesn't rely on the string from GetStringAsync. DoIndependentWork(); string urlContents = await getStringTask; //The thing is that this returns an int to a method that has a return type …

9
网站无法在asp.net中工作System.Web.WebPages.Razor.Configuration.HostSection无法转换为
我在服务器上遇到这样的问题 无法将[A] System.Web.WebPages.Razor.Configuration.HostSection强制转换为[B] System.Web.WebPages.Razor.Configuration.HostSection。类型A源自'System.Web.WebPages.Razor,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'在上下文'Default'中的位置'C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_2.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll'。类型B源自'System.Web.WebPages.Razor,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'在上下文'Default'中的位置'C:\ Windows \ Microsoft.Net \ assembly \ GAC_MSIL \ System .Web.WebPages.Razor \ v4.0_1.0.0.0__31bf3856ad364e35 \ System.Web.WebPages.Razor.dll'。 说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。 异常详细信息:System.InvalidCastException:无法将[A] System.Web.WebPages.Razor.Configuration.HostSection强制转换为[B] System.Web.WebPages.Razor.Configuration.HostSection。类型A源自'System.Web.WebPages.Razor,Version = 2.0.0.0,Culture …

9
是否可以“等待收益回报DoSomethingAsync()”
常规迭代器块(即“收益回报”)是否与“异步”和“等待”不兼容? 这样可以很好地说明我要做什么: async Task&lt;IEnumerable&lt;Foo&gt;&gt; Method(String [] Strs) { // I want to compose the single result to the final result, so I use the SelectMany var finalResult = UrlStrings.SelectMany(link =&gt; //i have an Urlstring Collection await UrlString.DownLoadHtmlAsync() //download single result; DownLoadHtmlAsync method will Download the url's html code ); return …

5
为什么此异步操作挂起?
我有一个多层.Net 4.5应用程序,该应用程序使用C#的new async和await挂起的关键字来调用方法,但我不知道为什么。 在底部,我有一个异步方法来扩展我们的数据库实用程序OurDBConn(基本上是基础DBConnection和DBCommand对象的包装器): public static async Task&lt;T&gt; ExecuteAsync&lt;T&gt;(this OurDBConn dataSource, Func&lt;OurDBConn, T&gt; function) { string connectionString = dataSource.ConnectionString; // Start the SQL and pass back to the caller until finished T result = await Task.Run( () =&gt; { // Copy the SQL connection so that we don't get two …

2
将同步代码包装为异步调用
我在ASP.NET应用程序中有一个方法,要花大量时间才能完成。在一个用户请求期间,此方法的调用最多可能发生3次,具体取决于用户提供的缓存状态和参数。每次通话大约需要1-2秒才能完成。该方法本身是对服务的同步调用,无法覆盖实现。 因此,对该服务的同步调用如下所示: public OutputModel Calculate(InputModel input) { // do some stuff return Service.LongRunningCall(input); } 方法的用法是(请注意,方法的调用可能会发生多次): private void MakeRequest() { // a lot of other stuff: preparing requests, sending/processing other requests, etc. var myOutput = Calculate(myInput); // stuff again } 我尝试从自己的角度更改实现,以提供此方法的同步工作,这就是到目前为止的内容。 public async Task&lt;OutputModel&gt; CalculateAsync(InputModel input) { return await Task.Run(() =&gt; …

5
导致死锁的异步/等待示例
我遇到了一些使用c#的async/ await关键字进行异步编程的最佳实践(我是c#5.0的新手)。 给出的建议之一如下: 稳定性:了解您的同步上下文 ...某些同步上下文是不可重入的和单线程的。这意味着在给定时间只能在上下文中执行一个工作单元。Windows UI线程或ASP.NET请求上下文就是一个例子。在这些单线程同步上下文中,很容易使自己陷入僵局。如果您从单线程上下文中生成任务,然后在上下文中等待该任务,则您的等待代码可能会阻止后台任务。 public ActionResult ActionAsync() { // DEADLOCK: this blocks on the async task var data = GetDataAsync().Result; return View(data); } private async Task&lt;string&gt; GetDataAsync() { // a very simple async method var result = await MyWebService.GetDataAsync(); return result.ToString(); } 如果我自己剖析,则主线程会生成一个新线程MyWebService.GetDataAsync();,但是由于主线程在此等待,因此它将在中等待结果GetDataAsync().Result。同时,说数据准备好了。为什么主线程不继续其继续逻辑并从中返回字符串结果GetDataAsync()? 有人可以解释一下为什么上面的示例中出现死锁吗?我完全不知道问题是什么...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.