Questions tagged «c#-5.0»

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

4
一个好的尝试/捕获/最终解决方案?
我需要async在一个catch块中调用一个方法,然后再次引发异常(及其堆栈跟踪),如下所示: try { // Do something } catch { // <- Clean things here with async methods throw; } 但是很遗憾,您不能await在catch或finally块中使用。我了解到这是因为编译器没有任何办法可以返回一个catch块来执行await指令或类似指令之后的内容... 我试图用它Task.Wait()来替换await,但陷入僵局。我在网上搜索了如何避免这种情况的方法,并找到了该站点。 由于我无法更改async方法,也无法知道它们是否在使用ConfigureAwait(false),因此创建了这些方法,这些方法采用a Func<Task>,一旦我们在不同的线程上(以避免死锁),它就会启动异步方法并等待其完成: public static void AwaitTaskSync(Func<Task> action) { Task.Run(async () => await action().ConfigureAwait(false)).Wait(); } public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action) { return Task.Run(async () => await action().ConfigureAwait(false)).Result; } public static …

9
在捕获块中等待
我有以下代码: WebClient wc = new WebClient(); string result; try { result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) ); } catch { result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) ); } 基本上,我想从一个URL下载,当它失败并出现异常时,我想从另一个URL下载。当然这两个时间都是异步的。但是由于以下原因,代码无法编译 错误CS1985:无法在catch子句的主体中等待 好的,出于任何原因都被禁止,但是这里的正确代码模式是什么? 编辑: 好消息是C#6.0可能会允许catch和finally块中的等待调用。


3
为什么不能识别“异步无效”单元测试?
async void 单元测试不能在Visual Studio 2012中运行: [TestClass] public class MyTestClass { [TestMethod] public async void InvisibleMyTestMethod() { await Task.Delay(1000); Assert.IsTrue(true); } } 如果要进行异步单元测试,则测试方法必须返回Task: [TestMethod] public async Task VisibleMyTestMethod() { await Task.Delay(1000); Assert.IsTrue(true); } 为什么会这样呢?并不是说我绝对需要一种async void测试方法,我只是很好奇。async void即使无法运行,Visual Studio 2012在构建测试方法时也不会发出警告或错误。

2
将基于回调的异步方法转换为可等待任务的最佳方法
转换/包装使用回调的“经典”异步方法的最佳方法是什么,该方法返回一个(可等待的)任务? 例如,给定以下方法: public void GetStringFromUrl(string url, Action<string> onCompleted); 我知道将其包装到返回任务的方法中的唯一方法是: public Task<string> GetStringFromUrl(string url) { var t = new TaskCompletionSource<string>(); GetStringFromUrl(url, s => t.TrySetResult(s)); return t.Task; } 这是完成此任务的唯一方法吗? 并且有一种方法可以将对GetStringFromUrl(url,callback)的调用包装在任务本身中(即,调用本身将在任务内部运行而不是同步运行)

5
如何异步Files.ReadAllLines并等待结果?
我有以下代码, private void button1_Click(object sender, RoutedEventArgs e) { button1.IsEnabled = false; var s = File.ReadAllLines("Words.txt").ToList(); // my WPF app hangs here // do something with s button1.IsEnabled = true; } Words.txt我将大量单词读入s变量,我正在尝试使用C#5中的asyncandawait关键字,Async CTP Library因此WPF应用程序不会挂起。到目前为止,我有以下代码, private async void button1_Click(object sender, RoutedEventArgs e) { button1.IsEnabled = false; Task<string[]> ws = Task.Factory.FromAsync<string[]>( // What …

2
TPL与异步/等待(线程处理)之间的区别
试图了解TPL&async/await与线程创建之间的区别。 我相信TPL(TaskFactory.StartNew)的工作方式ThreadPool.QueueUserWorkItem与之类似,因为它使线程池中的线程上的工作排队。当然,除非您使用TaskCreationOptions.LongRunning它创建一个新线程。 我认为async/await本质上将类似地工作: TPL: Factory.StartNew( () => DoSomeAsyncWork() ) .ContinueWith( (antecedent) => { DoSomeWorkAfter(); },TaskScheduler.FromCurrentSynchronizationContext()); Async/ Await: await DoSomeAsyncWork(); DoSomeWorkAfter(); 将是相同的。从我一直在阅读的内容来看,似乎async/ await“有时”创建了一个新线程。那么,何时创建新线程,何时不创建新线程?如果您正在处理IO完成端口,我可以看到它不必创建新线程,但否则我认为必须这样做。我想我对FromCurrentSynchronizationContext永远的理解也有些模糊。从本质上讲,我始终认为它是UI线程。
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.