C#多线程の遇见长耗时操作以及多任务

4.0用         Task.Factory.StartNew(()=>{});
4.0以下用  ThreadPool.QueueUserWorkItem(()=>{})
4.0以上用  Task.Run(()=>{});

多任务:

Task[] tasks = new Task[maxCurrent];

for (int i = beginId; i <= maxId; i += interval, counter++)

tasks[counter] = new Task(worker.TestHandler, TaskCreationOptions.LongRunning);

var continuation = Task.Factory.ContinueWhenAll(
tasks,(antecedents) =>{

LogInfo("All threads have loaded!");

});

foreach (Task t in tasks)

t.Start();

LogInfo("All threads have been queued. Waiting to complete...");

while (!continuation.IsCompleted)

Thread.Sleep(1000);

static Random _random = new Random();
static void Main(string[] args)
{
ArrayList listThread = new ArrayList();
ArrayList listResult = new ArrayList();
for (int i = 0; i < 10; i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(WorkThread));
thread.Start(listResult);
listThread.Add(thread);
}

foreach (Thread thread in listThread)
{
thread.Join();
}

foreach (int i in listResult)
{
Console.WriteLine(i);
}
}

static void WorkThread(object list)
{
int cnt = _random.Next(1,10);
ArrayList listLocal = new ArrayList();
for (int i = 0; i < cnt; i++)
{
listLocal.Add(cnt);
Thread.Sleep(100);
}

lock (list)
{
(list as ArrayList).AddRange(listLocal);
}
}

时间: 2024-11-07 03:31:39

C#多线程の遇见长耗时操作以及多任务的相关文章

谈长耗时任务的优化

任何一个业务系统都有它的核心业务逻辑,在很多情况下核心业务逻辑通常都有一些特点:牵扯面广,依赖关系多,流程复杂等. 接下来,我就最近公司内一个真实的案例来简单谈谈对于一个长耗时的任务或者业务逻辑有哪些常用的优化手段. 案例简述 要说的这个系统案例是一个统一通信平台,它给客户提供收发短信.email.RTX消息等功能.不难想象最核心的业务当然是借助这个平台间接通过这些通讯 (sms/email/rtx)网关来收发消息.当然现实的场景远没这么简单,还有一些外围业务也围绕此展开: 权限管理 流量控制

普通int值在多线程下的递增操作

Java针对多线程下的数值安全计数器设计了一些类,这些类叫做原子类,其中一部分如下:  java.util.concurrent.atomic.AtomicBoolean;  java.util.concurrent.atomic.AtomicInteger;  java.util.concurrent.atomic.AtomicLong;  java.util.concurrent.atomic.AtomicReference;  下面是一个对比 AtomicInteger 与 普通 int

利用Spring MVC中@Async异步特性改善耗时操作的用户体验

Web应用中,有时会遇到一些耗时很长的操作(比如:在后台生成100张报表再呈现,或 从ftp下载若干文件,综合处理后再返回给页面下载),用户在网页上点完按钮后,通常会遇到二个问题:页面超时.看不到处理进度. 对于超时,采用异步操作,可以很好的解决这个问题,后台服务收到请求后,执行异步方法不会阻塞线程,因此就不存在超时问题.但是异步处理的进度用户也需要知道,否则不知道后台服务何时完成,不知道是否继续等候,还是关掉页面. 思路: 1.browser -> Spring-MVC Controller

java笔记--使用SwingWoker类完成耗时操作

使用SwingWoker类完成耗时操作: 对于Swing中的耗时操作,通常要在一个新的线程中运行,以免程序"假死". 在java6.0中,可以用SwingWoker类来完成 SwingWoker<T,V>是在专用线程中执行长时间GUI交互任务的抽象类.用Swing 编写多线程应用程序时,要记住两个约束条件:     1.不应该在事件指派线程运行耗时任务,否则应用程序将无反应.     2.只能在事件指派线程上访问Swing控件     注: 通常需要将耗时的任务放到Swin

异步委托(APM)使用Func异步操作,处理耗时操作

使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Demo 7 { 8 class Program 9 { 10 11 static void Main(string[] args) 12 { 13 Func<string> fun = new Func<s

如何为无法获取进度百分比的耗时操作增加“伪进度条”?

在实际开发中,可能会遇到这样的场景:“一个操作非常耗时,但却无法获取其进度百分比”.造成这种情况的原因可能有: 1)该操作属于第三方库(泛指我们使用但无法修改的第三方代码,因此质量有高有底),可能由于第三方库作者没有意识到这个操作在某些情况下会非常耗时,没有提供进度值. 2)某些操作压根就无法计算进度或者计算进度要牺牲极大的效率. 这种场景,执行这样的耗时操作会导致程序UI假死.为了提高用户体验,我们可以为该操作提供一个假的进度条,即保证程序UI不假死.我们将耗时操作放到子线程中去执行,然后在G

Android Studio学习随笔-模拟耗时操作(sleep)

在这里我申明一点,因为我是挂着VPN去YOUTOBE看的尚学堂的高明鑫老师讲的Android基础学习视频,有些东西他没有讲,而我也没办法,只能等两个星期后学校请老师来的时候进行询问,当然我也会将一些问题发布在博客里,希望有一些粗腿可以让我抱一下 在此次随笔中,我将讲一下用sleep进行的耗时操作,由于高老师在视频中也是一掠而过,我也只能讲一点点,先附上代码 1 button.setOnClickListener(new View.OnClickListener() { 2 @Override 3

加载页面遮挡耗时操作任务页面--第三方开源--AndroidProgressLayout

在Android的开发中,往往有这种需求,比如一个耗时的操作,联网获取网络图片.内容,数据库耗时读写等等,在此耗时操作过程中,开发者也许不希望用户再进行其他操作(其他操作可能会引起逻辑混乱),而此时需要给用户一个额外的加载页面遮挡住主逻辑代码的运行,待主页面的耗时操作完成后,自动消失这样加载过度页面,恢复出正常应该显示的页面. 举个实际的例子,如代码使用Android WebView打开一个网页链接试图加载某个网站,但网络质量不佳,需要耗时很久,那么在这个过程中,较好的用户体验做法是:给用户一个

Android耗时操作

No subscribers registered for event class com.test.MessageEvent import de.greenrobot.event.EventBus; 不是 org.....那个包 内存中要先有订阅者,然后发送者才能把信息发送到他那. A->B ,Activity A发送给B, 则B这个Activity要先有. 可以配置B为app的启动页面,然后跳转到A,则此时内存中AB都有(先有B,再有A),然后A发送消息给B,最终B的吐司能在A页面上看到,在