Tag: 任务并行库

缩进lambda和嵌套动作

当使用lambdas时,通常是在TPL上,我会因缩进而迷失…是否有一些最佳实践来格式化? 例如,请使用以下代码: Task t1 = factory.StartNew(() => { DoSomething(); } .ContinueWith((t2) => { DoSomethingWhenComplete(); }, TaskContinuationOptions.OnlyOnRanToCompletion) ).ContinueWith((t3) => { DoSomethingOnError(); }, TaskContinuationOptions.OnlyOnFaulted); 我的“缩进”是否正确? 在该示例中,我想执行t1,然后如果它完成OK,则执行t2,并在执行t3时执行错误。 但看起来好像t3是t2的延续,而不是来自t1 …我需要在该代码中修复什么才能获得正确的行为? 我想我已经迷失在那个缩进或遗漏了一些括号……

异步套接字读取:不能退出启动线程 – 该怎么办?

我有一个我异步读取的NetworkStream(使用async / await) await Task.Factory.FromAsync((cb, state) => stream.BeginRead(buffer, offset, readLen – offset), stream.EndRead, null); 不幸的是,有时会发生ioexception:“由于线程退出或应用程序请求,I / O操作已中止。” 我相信我达到了Socke.EndReceive中记录的要求: http : //msdn.microsoft.com/en-us/library/w7wtt64b.aspx 。 哪个州: 当该线程退出时,由给定线程启动的所有I / O都将被取消。 如果线程在操作完成之前退出,则挂起的异步操作可能会失败。 由于异步方法在默认调度程序上运行,因此无法保证此要求。 有没有解决的办法? 我是否需要启动专用线程来启动I / O? 最好的问候,德克

是否存在不应使用任务的情况?

我正在阅读有关使用4.0进行异步编程的首选方法。 我只是想知道是否有任何用例不应该优先使用任务而不是普通的c#线程?

在TaskCompletionSource.Task(已经调用了.SetResult)上调用ContinueWith方法是否安全?

如果已经调用了TaskCompletionSource.SetResult(…)在TaskCompletionSource.SetResult(…)上使用ContinueWith(…)方法是否安全? 这个基本代码有望帮助构建问题: // this was written inside the question box, please excuse any silly errors and lack of error checking (I’m not near VS right now)… private WebClient _webClient = new WebClient(); public Task GetExamplePage() { var tcs = new TaskCompletionSource(); web.DownloadStringCompleted += (s, ea) => tcs.SetResult(ea.Result); web.DownloadStringAsync(new URI(@”http://www.example.com/example.html”)); return tcs.task; } public void ProcessExamplePage() […]

使用Task.Run旋转的线程始终以退出代码259退出

作为一个简单的例子,我有一个WPF应用程序,主窗口上有一个按钮,因此代码背后: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } async void Button_Click(object sender, RoutedEventArgs e) { await Task.Run(() => this.DoOnThread()); } async Task DoOnThread() { Thread.CurrentThread.Name = “MyTestThread”; Thread.Sleep(1000); return true; } } 如果我通过VisualStudio线程窗口中断“返回true”我可以获得ThreadID,如果我继续并让代码运行完成并等待一段时间直到线程退出,我得到“线程0x9ad34已经退出代码259(0x103) )“显示在VS输出窗口中。 我做错了什么,如何确保线程退出代码为0?

如何捕获/观察从Task抛出的未处理exception

我正在尝试在我的应用程序中记录/报告所有未处理的exception(错误报告解决方案)。 我遇到过一个总是未处理的情景。 我想知道如何以未处理的方式捕获此错误。 请注意,我今天早上做了很多研究并尝试了很多东西..是的,我已经看过这个 , 这个以及更多。 我只是在寻找一种通用的解决方案来记录未处理的exception。 我在控制台测试应用程序主要方法中有以下代码: Task.Factory.StartNew(TryExecute); 要么 Task.Run((Action)TryExecute); 以及以下方法: private static void TryExecute() { throw new Exception(“I’m never caught”); } 我已经尝试在我的应用程序中连接到以下内容,但它们从未被调用过。 AppDomain.CurrentDomain.UnhandledException TaskScheduler.UnobservedTaskException 在我最初发现此错误的Wpf应用程序中,我也连接到这些事件,但它从未被调用过。 Dispatcher.UnhandledException Application.Current.DispatcherUnhandledException System.Windows.Forms.Application.ThreadException 唯一被称为的处理程序是: AppDomain.CurrentDomain.FirstChanceException 但这不是一个有效的解决方案,因为我只想报告未捕获的exception(并非每个exception,因为在执行/解析任何catch块之前调用FirstChanceException。

Action和Func参数的歧义

这段代码怎么可能 TaskManager.RunSynchronously(fileMananager.BackupItems, package); 导致编译错误 The call is ambiguous between the following methods or properties: ‘TaskManager.RunSynchronously(System.Action, MyObject)’ and ‘TaskManager.RunSynchronously(System.Func, MyObject)’ 当行动的签名是 public void BackupItems(MyObject package) 和“暧昧”的方法是 static class TaskManager { public static void RunSynchronously(Action task, TInput param) { Task.Factory.StartNew(() => task(param)); } public static bool RunSynchronously(Func task, TInput param) { return Task.Factory.StartNew(() => task(param)).Result; } } […]

如果我等待已经运行或运行的任务会发生什么?

有一个Task变量,让我们说现在正在运行任务..通过执行以下行。 await _task; 我想知道当我编写这段代码时会发生什么: await _task; await _task; 它会执行两次任务吗? 或抛出exception,因为它已经运行?

为什么Parallel.Foreach会创建无穷无尽的线程?

下面的代码继续创建线程,即使队列是空的。最终会发生OutOfMemoryexception。 如果我用常规foreach替换Parallel.ForEach,则不会发生这种情况。 有人知道为什么会这样吗? public delegate void DataChangedDelegate(DataItem obj); public class Consumer { public DataChangedDelegate OnCustomerChanged; public DataChangedDelegate OnOrdersChanged; private CancellationTokenSource cts; private CancellationToken ct; private BlockingCollection queue; public Consumer(BlockingCollection queue) { this.queue = queue; Start(); } private void Start() { cts = new CancellationTokenSource(); ct = cts.Token; Task.Factory.StartNew(() => DoWork(), ct); } private void DoWork() […]

Task.Factory.FromAsync和BeginX / EndX之间的区别?

当使用TcpClient中的标准BeginRead和EndRead方法并使用Task.Factory.FromAsync时,我有非常相似的代码。 以下是一些示例..error handling代码未显示。 Task.Factory.FromAsync: private void Read(State state) { Task read = Task.Factory.FromAsync(state.Stream.BeginRead, state.Stream.EndRead, state.Bytes, state.BytesRead, state.Bytes.Length – state.BytesRead, state, TaskCreationOptions.AttachedToParent); read.ContinueWith(FinishRead); } private void FinishRead(Task read) { State state = (State)read.AsyncState; state.BytesRead += read.Result; } 使用BeginRead和EndRead标准使用回调: private void Read(State state) { client.BeginRead(state.Bytes, state.BytesRead, state.Bytes.Length – state.Bytes.Read, FinishRead, state); } private void FinishRead(IAsyncResult async) { […]