与上面的RulyCanceler类的代码相比,我想使用运行代码 CancellationTokenSource.
如何在取消令牌中提到它,即不抛出/捕获异常?我可以使用该IsCancellationRequested物业吗?
我试图像这样使用它:
cancelToken.ThrowIfCancellationRequested();
Run Code Online (Sandbox Code Playgroud)
和
try
{
new Thread(() => Work(cancelSource.Token)).Start();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
Run Code Online (Sandbox Code Playgroud)
但这cancelToken.ThrowIfCancellationRequested();在方法中给出了运行时错误Work(CancellationToken cancelToken):
System.OperationCanceledException was unhandled
Message=The operation was canceled.
Source=mscorlib
StackTrace:
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33
at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Run Code Online (Sandbox Code Playgroud)
我成功运行的代码在新线程中捕获了OperationCanceledException:
using System;
using System.Threading; …Run Code Online (Sandbox Code Playgroud) .NET 4.5中 有Task.Delay
我怎么能在.NET 4.0中做同样的事情?
.net c# parallel-processing multithreading task-parallel-library
该接受的答案质疑"为什么这个Parallel.ForEach代码冻结程序吗?" 建议在WPF应用程序中用ConcurrentBag替换List使用.
我想了解是否可以在这种情况下使用BlockingCollection?
读取Parallel.ForEach后继续产生新线程我仍然怀疑它是否是计算并发线程数的正确方法?
我看到的是,该方法计算同时输入但未完成的迭代(循环)的数量Parallel.ForEach.
它是传递正确数量的同时运行线程的并发线程数的同义词吗?
我不是专家,但我可以想象:
无论如何,如何直接计算.NET进程的运行线程数,最好是(C#)代码?
更新:
所以,如果要遵循Jeppe Stig Nielsen的回答并使用计数
directThreadsCount = Process.GetCurrentProcess().Threads.Count;
Run Code Online (Sandbox Code Playgroud)
然后输出,在Release(threadsCount == 7)和Debug(threadsCount == 15)模式下非常相似:
[Job 0 complete. 2 threads remaining but directThreadsCount == 7
[Job 1 complete. 1 threads remaining but directThreadsCount == 7
[Job 2 complete. 2 threads remaining but directThreadsCount == 7
[Job 4 complete. 2 threads remaining but directThreadsCount == 7
[Job 5 complete. 2 threads remaining but directThreadsCount == 7
[Job 3 complete. 2 …Run Code Online (Sandbox Code Playgroud) c# debugging multithreading visual-studio task-parallel-library
.NET 4.0引入了System.Collections.Concurrent命名空间:
" System.Collections.Concurrent命名空间提供了几个线程安全的集合类,只要多个线程同时访问集合,就应该使用它们代替System.Collections和 System.Collections.Generic命名空间中的相应类型"
BlockingCollection<T> 类ConcurrentBag<T> 类ConcurrentQueue<T> 类ConcurrentDictionary<TKey, TValue> 类OrderablePartitioner<TSource> 类Partitioner 类IProducerConsumerCollection<T> 接口该SynchronizedCollection<T>班(因为.NET 3.0中提供):
"提供一个线程安全的集合,其中包含泛型参数指定的类型的对象作为元素"
...在System.Collections.Generic命名空间中.
那么,为什么SynchronizedCollection<T>类是线程安全但不并发?
具体是什么使得SynchronizedCollection<T>泛型类与那些中的集合不同并且不兼容System.Collections.Concurrent?
更新:
让我重新解释一下这个问题:属于System.Collections.Concurrent命名空间的所有泛型集合中的共同点和区分新特性是什么,这在SynchronizedCollection<T>通用类中是不存在的(并且在使用时不可能)?
我将标题更改为" System.Collections.Concurrent在.NET 3.0中添加了什么.NET 4.0 集合SynchronizedCollection?".
但大多数情况下,我很想知道是什么让它无法在.NET 3.0的基础上进行
更新2:关于说明:
"这个问题可能已经有了答案:
答案在我的问题的背景下令人困惑 - 新功能是进化的(使用预4.0版功能)还是革命性的(在.NET 4.0之前不可用)?
我试图掌握.NET 4.0+任务并行库概念......
在以下C#4.0代码段中:
Task t = Task.Factory.StartNew(() =>
{
Console.WriteLine("I am the task");
return "res1";
});
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有(和运行时)如果不能使用返回产生任何错误,除非使用通用任务:
Task<string> t = Task.Factory.StartNew(() =>
{
Console.WriteLine("I am the task");
return "res1";
});
Run Code Online (Sandbox Code Playgroud)
或者它(返回的对象)可以使用?
做正确地明白的是<string>在Task<string>仅需要用于检测或确保返回(编辑对象)的类型或t.Result?
或者除了这个以外还有其他隐藏的必需品吗?
为什么这种类型不能从返回对象的类型中确定?
也就是为什么任务的Result属性不可用于非通用任务?
这两个1小时的视频逐步展示了如何使用MVVM模式在Silverlight和WPF中构建简单的测验应用程序:
在Silverlight中实现Model-View-ViewModel
令我惊讶的是,它们在结构上有多么不同,例如,它们如何使用DataBinding:
在Silverlight方法中,我们将View的DataContext设置为ViewModel中的ObservableCollection:
<views:QuestionView x:Name="QuestionDataView" />
QuestionViewModel qdata = new QuestionViewModel();
qdata.FetchQuestions();
QuestionDataView.DataContext = qdata.Questions;
Run Code Online (Sandbox Code Playgroud)
在WPF方法中,我们将Window的DataContext设置为ViewModel本身.
<view:QuizView Margin="4" />
base.DataContext = new QuizViewModel(Quiz.Create());
Run Code Online (Sandbox Code Playgroud)
看起来我看到的每个MVVM示例都在一个稍微新的变体中进行DataContext绑定,并且我试图确定" 如何在MVVM模式中完成DataContext绑定 ".
当你决定将DataContext绑定到某个东西时,你的头脑是什么:为什么将Window/View/ListBox /等的DataContext绑定到ObservableCollection/ModelView /等?这里有哪些优点,缺点和策略?
任何输入赞赏.
你能告诉我一个简单的C#LINQ/lambda表达式代码练习的资源吗?
理想但不是强制性的:在线,免费,有答案,一步一步,最简单快速,研究语法但不是复杂的谜题或世界问题.
我不认为它是重复的
因为它是2年多以前,所以可能已经过时了,它没有任何好的参考(通过所有这些参考).
我设法找到的最佳谷歌搜索结果是:
虽然我不满意.
更新:
类似于LINQ测验的东西,这对我来说是目前我能找到的最佳参考.
最近我已经阅读了很多关于.NET中的并行编程的内容,但我仍然对这个主题的文本中的语句相矛盾.
例如,弹出(在鼠标指向标记的图标上时)stackoverflow.com task-parallel-library标记的描述:
"任务并行库是.NET 4的一部分.它是一组API,使开发人员能够编写多核共享内存处理器"
这是否意味着使用早期版本的.NET无法实现多核d和并行编程应用程序?
我是否在.NET多线程应用程序中控制核心之间的多核/并行使用/分配?
如何识别要运行线程的核心并将线程归属到特定核心?
什么启用了.NET 4.0+任务并行库,这在以前的.NET版本中是不可能的?
更新:
嗯,很难提出具体问题,但我想更好地理解:
.NET在开发多线程应用程序和并行编程之间有什么区别?
到目前为止,我无法理解它们之间的区别
Update2:
MSDN ".NET Framework中的并行编程"从.NET 4.0版本开始,其文章任务并行库告诉:
"从.NET Framework 4开始,TPL是编写多线程和并行代码的首选方式"
您是否可以提示如何在.NET4之前(在.NET3.5中)专门创建并行代码,同时考虑到我熟悉多线程开发?
c# parallel-processing concurrency multithreading task-parallel-library
问题" 多值字典 " 的多个答案建议使用类TValue中的不可变类Dictionary<TKey, TValue>.
接受的Jon Skeet的答案提出了一个Pair具有readonly属性的类和@ teedyay使用不可变的答案Tuple.
这种方法的基本原理(或可能的好处)是什么?
和附带问题:如果相应的属性First和Second无论如何都没有setter,
为什么要使TFirst和TSecond只读:
private readonly TFirst first;
private readonly TSecond second;
public TFirst First
{
get { return first; }
}
public TSecond Second
{
get { return second; }
}
Run Code Online (Sandbox Code Playgroud)
更新:
我正在使用带有自定义类的字典来表示其中的值.
并且va lues正在更新.
让我们变成一成不变的可能原因(好处)是什么?
我看Lookup<TKey, TElement> Class也是不可改变的,以为我错过使用LINQ查询的一些好处(?)
如果是这样,你可以给我什么样的例子我错过?
c# ×9
.net ×3
concurrency ×3
linq ×3
collections ×2
wpf ×2
asynchronous ×1
c#-4.0 ×1
conceptual ×1
debugging ×1
dictionary ×1
generics ×1
lambda ×1
mvvm ×1
silverlight ×1