小编Ful*_*oof的帖子

如何使用CancellationToken属性?

与上面的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)

c# concurrency multithreading synchronization asynchronous

103
推荐指数
5
解决办法
15万
查看次数

68
推荐指数
4
解决办法
5万
查看次数


如何计算.NET应用程序中的并发线程数量?

读取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

20
推荐指数
2
解决办法
4万
查看次数

什么.NET 4.0 System.Collections.Concurrent集合在功能中添加到.NET 3.0 SynchronizedCollection?

.NET 4.0引入了System.Collections.Concurrent命名空间:

" System.Collections.Concurrent命名空间提供了几个线程安全的集合类,只要多个线程同时访问集合,就应该使用它们代替System.CollectionsSystem.Collections.Generic命名空间中的相应类型"

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:关于说明:

"这个问题可能已经有了答案:

SynchronizedCollection和其他并发集合之间有什么区别?"

答案在我的问题的背景下令人困惑 - 新功能是进化的(使用预4.0版功能)还是革命性的(在.NET 4.0之前不可用)?

c# collections concurrency multithreading thread-safety

10
推荐指数
2
解决办法
8239
查看次数

为什么Task的Result属性对于非泛型任务(C#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属性不可用于非通用任务?

.net c# multithreading task-parallel-library c#-4.0

9
推荐指数
1
解决办法
5179
查看次数

在MVVM中绑定DataContext的策略是什么?

这两个1小时的视频逐步展示了如何使用MVVM模式在Silverlight和WPF中构建简单的测验应用程序:

在Silverlight中实现Model-View-ViewModel

在WPF中实现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 /等?这里有哪些优点,缺点和策略?

任何输入赞赏.

silverlight wpf conceptual mvvm

6
推荐指数
1
解决办法
5274
查看次数

你能告诉我一个LINQ/lambda代码练习的资源吗?

你能告诉我一个简单的C#LINQ/lambda表达式代码练习的资源吗?

理想但不是强制性的:在线,免费,有答案,一步一步,最简单快速,研究语法但不是复杂的谜题或世界问题.

我不认为它是重复的

因为它是2年多以前,所以可能已经过时了,它没有任何好的参考(通过所有这些参考).

我设法找到的最佳谷歌搜索结果是:

虽然我不满意.

更新:
类似于LINQ测验的东西,这对我来说是目前我能找到的最佳参考.

c# linq generics lambda

6
推荐指数
1
解决办法
1570
查看次数

.NET在开发多线程应用程序和并行编程之间有什么区别?

最近我已经阅读了很多关于.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

6
推荐指数
2
解决办法
5151
查看次数

为什么要在字典中使用不可变值?

问题" 多值字典 " 的多个答案建议使用类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查询的一些好处(?)
如果是这样,你可以给我什么样的例子我错过?

.net c# linq collections dictionary

5
推荐指数
1
解决办法
408
查看次数