在C#4.0中,我们已经Task在System.Threading.Tasks命名空间.之间有什么真正的改变Thread和Task.我为了学习而做了一些示例程序(帮助从MSDN获取)
Parallel.Invoke
Parallel.For
Parallel.ForEach
Run Code Online (Sandbox Code Playgroud)
但有很多疑问,因为这个想法并不那么清楚.
我最初在Stackoverflow中搜索了类似类型的问题但可能是这个问题标题我无法得到相同的.如果有人知道之前发布的相同类型的问题,请提供链接的参考.
我正在编写一个基于await/sleep范例的网络绑定应用程序.
有时会发生连接错误,根据我的经验,等待一段时间再重试操作是值得的.
问题是,如果我在await/async中使用Thread.Sleep或类似的阻塞操作,它会阻止调用程序线程中的所有活动.
我应该用什么来替换Thread.Sleep(10000)以获得相同的效果
await Thread.SleepAsync(10000)
Run Code Online (Sandbox Code Playgroud)
?
UPDATE
我更喜欢一个没有创建任何额外线程的答案
我知道它有3种方法.在我的程序中,我有一个发送消息的方法.这通常很晚,程序有时根本不响应按钮按下发送消息.有时它比我期望的晚5秒,程序冻结.我想使用a BackgroundWorker按预期发送消息,并允许程序始终正常运行.我有用于在按钮处理程序中发送消息的代码.现在我在哪里放这个等效的代码?我希望所有这些仍然可以通过按钮按下来处理.
这是合适的处理程序吗?
backgroundWorker1.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)
并在:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {}
Run Code Online (Sandbox Code Playgroud)
我要把我的代码放在按钮处理程序中?而这之前:
carga.progressBar1.Minimum = 0;
carga.progressBar1.Maximum = 100;
Run Code Online (Sandbox Code Playgroud)
Carga是ProgressBar的另一种形式.如何在此方案中使用BackgroundWorker?
Microsoft .NET基类库提供了几种创建线程并启动它的方法.基本上,调用与提供相同类型服务的每个其他调用非常相似:创建表示执行流(或更多)的对象,为其分配表示要执行的执行流的委托,并最终根据委托签名,对象作为参数.
那么,有两种方法(基本上):
1)使用System.Threading.Thread课程.
Thread curr = new Thread(myfunction); /* In a class, myfunction is a void taking an object */
curr.Start(new Object()); /* Or something else to be downcast */
Run Code Online (Sandbox Code Playgroud)
2)使用System.Threading.ThreadPool课程.
ThreadPool.QueueUserWorkItem(myfunction, new Object()); /* Same philosophy here */
Run Code Online (Sandbox Code Playgroud)
我应该使用1)或2)有什么特殊原因吗?
我有一种感觉,答案是:"视情况而定".能否列举一些方法比另一种更好的情况?
Windows 7,Intel CORE i3,64位,RAM 4Gb,2.27 GHz
.NET Framework 4.0
我有以下代码:
static void Main(string[] args)
{
var timer = new Stopwatch();
timer.Start();
for (int i = 0; i < 0xFFF; ++i)
{
// I use one of the following line at time
Task.Factory.StartNew(() => { });
new Thread(() => { }).Start();
}
timer.Stop();
Console.WriteLine(timer.Elapsed.TotalSeconds);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
如果我使用Task,输出总是小于0.01秒,但如果我使用Thread,输出总是大于40秒!
这怎么可能?为什么这么大的差异?