C#如何让awit之后的代码在指定的线程执行,像winform那样保证awit之后的代码在UI线程执行

图片说明

    一般我们使用async/awit语法糖写的代码,awit之后会切换到别的线程。但是winform总是能保证awit之后的代码在UI线程执行。比如图中三次textBox1.AppendText()都是在UI线程执行,winform是如何做到的。
    如果一个方法里awit之前和awit之后都会操作类的成员变量,这个方法并发执行的话不安全。如果我能像winform那样保证awit前后的代码都是在同一个线程执行,那就不存在线程安全问题了。我知道一个方案是使用Task.ContinueWith方法,这样我可以传入自定义的任务调度器,在任务调度器里可以让所有任务排队到同一个线程执行。但是我希望使用async/awit语法糖,我该怎么做?
    既然winform都能做到,那我想这是可以实现的吧。

1个回答

得益于热心网友,问题算是解决了,贴上简单的测试代码

图片说明

主要是调用SynchronizationContext.SetSynchronizationContext(ctx),设置成自定义的MySynchronizationContext类型
参考链接:https://www.cnblogs.com/lzxianren/p/SynchronizationContext.html

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何得到线程执行完之后返回的结果
在实际开发过程中,很多时候要将子线程执行完后返回的结果给到主线程里。具体怎么实现呢?这里给出3个实现方法!1、根据反射原理实现很多人都习惯在调用线程的时候,通过构造方法给线程传递参数,这里我们在构造方法里传两个参数,一个是类 callback,一个是方法名 method。这样我们在线程的run方法最后 执行callback.getMethod(method).invoke(null); 这样就...
线程执行?
线程在被thread.resume以后,为什么不立即跳去执行线程的代码,而是等着个事件结束后再去执行线程的代码,有什么方法可以让他在thread.resume后就立即执行线程的代码?
线程执行
Button1事件rnfor(int i=0;i<9;i++)rnrnThread A=new Thread(new Threadstart(add))rnA.start();rnA.Jion();--------------我想在这里直接做add(),做完了之后再做下面的事,每次循环都是这样子rnrn rnpublic void add()rnrn string a="a";rn
两个线程执行之后变量的值,求教
int sum = 0;rnvoid Func ()rnrn for (int i = 0; i < 10; ++i)rn sum += 2;rnrn用两个线程并发执行Func函数,等两个线程都结束, 求sum取值范围
如何在线程执行完之后,释放资源
如何在线程执行完之后,释放资源,我如何判断一个线程执行完毕?
C# async/awit 嵌套异步 执行顺序 分析
使用非异步方法调用可异步方法(内含嵌套异步)效果图:代码(在控制台mian函数中运行该函数):        private static void AsyncTest()         {             Func&amp;lt;Task&amp;lt;string&amp;gt;&amp;gt; Fun1 = () =&amp;gt;             {                 Thread.Sleep(4...
让线程执行指定的时间间隔,停止执行。
实例代码如下:让100个线程连续执行一分钟后停止执行。rnrn[code=java]rnpublic class Print implements Runnablern public void run() rn long t = System.currentTimeMillis();//系统一开始的运行时间复制给t,精确到毫秒。rn while(true)rn if(System.currentTimeMillis()-t>60000)rn break;// break是结束整个循环体,结束while循环。rn rn System.out.println("打印的东西");rn rn System.out.println("执行结束");rn rn public static void main(String[] args) rn //启动线程rn for(int i = 0;i<100;++i)rn Print p = new Print();rn Thread t = new Thread(p);rn t.start();rn rn rnrnrn rn[/code]
c#线程执行问题
[size=13px][/size][b]我想在在按钮事件里,希望通过启动一个线程,执行cmd命令,来创建一个文件夹和文件,可是点击按钮没反应,代码如下:rnrn[color=#00FF00]rnProcess pr = new Process();rnpr.StartInfo.FileName="cmd.exe";rn pr.StartInfo.UseShellExecute = false;rnpr.StartInfo.RedirectStandardInput = true;rnpr.StartInfo.RedirectStandardOutput = true;rn pr.StartInfo.RedirectStandardError = true;rnstring cmd = "md " + cbxDriver.SelectedText + "autorun.inf";rnstring cmd2=cmd+@"\sys..\";rnpr.Start();rnpr.StandardInput.WriteLine(cmd);rnpr.StandardInput.WriteLine(cmd2);[/color]rnrncbxDriber是comboBox 控件,用来选择磁盘。[/b]
C# 计算线程执行的剩余时间
在winform中 我新开辟了一个线程 执行一个方法:rnrn[code=csharp]//...rnprogressBar.Value = 0;rnprogressBar.Maximum = data.Rows.Count;rnfor (int i = 0; i < data.Rows.Count; i++)rnrn //....rnrn progressBar.Value++;rn labMsg.Text = "已经执行..." + progressBar.Value + " / " + progressBar.Maximum + "";rnrn//...[/code]rnrn如何计算剩余时间??
winform 线程执行上下文流动源码
winform 线程执行上下文流动源码! 很值得下载看看!资源免费,大家分享!!
主线程在结束时,如何让其他线程执行一段代码?
在辅助用户界面线程的ExitInstance()函数当中添加了一些代码,想让整个程序结束时,执行它。但在调试时发现,当点击主线程窗口关闭程序时,发现用户界面线程并没有实行ExitInstance()中的代码.好像主线程强制辅助线程终止了.rn哪位大侠知道在主线程在结束时,如何让其他线程执行一段代码?
如何控制线程执行时间?
我在编一个多线程的程序,调试时有的线程执行的时间太长。rn请问,用什么方法可以控制线程执行的时间?rn(怎样记时、怎样结束线程?)
线程执行的时间间隔
刚刚学了一点线程的东西,为了在指定的时间间隔之后继续执行,我是这样实现的:rnprocedure TWatchThread.execute;rnvarrn dt:TDateTime;rnbeginrn tryrn while(true) do beginrn dt:=Now;rn if(SecondsBetween(self.dtLoadedTime,dt)
线程执行的先后顺序
我有三个线程,如果不使用线程池的。rn且线程1先于线程2和线程3运行,线程2和线程3必须交替占用时间片,但是2,3线程的运行必须以线程已先运行为基础,即如果线程1没有运行的话,线程2,3 就不执行,请问如何解决这个问题啊!rnrn毕业设计,时间紧迫,望高手赐教!
线程执行问题
我在主函数main()里创建了线程creatThread()创建线程以后下面还有一些代码要执行,但是创建线程以后,主函数要等待线程函数执行完了才返回继续执行,我不想这样,因为我创建出来的线程作用是定期的去检查一个东西,我想让主函数main里的代码继续执行,还想让子线程也一直执行该怎么办??
线程执行的问题
因为IO操作时间的问题,所以在程序中起动线程来进行文件的输出:rn ThreadStart entryPoint = new ThreadStart(OnLoggerProc); thisTrd = new Thread(entryPoint); thisTrd.Name = "Log Output Thread"; thisTrd.Start(); rnprivate void OnLoggerProc()rnrn tryrn rn IntPtr [] hEvt= rn _LogFileHandle, _LogControlHandle, _BothLogHandlern ;rnrn while(true) rn int dwRet = WaitForMultipleObjects(3, hEvt, false, INFINITE switch(dwRet)rn rn case 0:rn LogFileOutput(); ResetEvent(_LogFileHandle); rn break;rn case 1:rn ...rn break;rn case 2:rn ... break;rn default:rn break;rn rn rn rn catch(Exception ex) rnrnLogFileOutput函数复测文件的输出,当输出文件比较少的时候能够正常结束线程,但是当文件很多(上万条)的时候,结束线程时就会报错。不知道那位能够解决,不胜感激!
如何监视线程执行的结果?
代码大意如下——rn首先,我写了一个类,继承timertaskrnclass MyTask extends TimerTaskrn public boolean flag;//其中一个属性,用来记录task完成的结果rnrn public void run()rn if(某条件)rn flag = true;rn rnrnrn第二,写了一个普通类,里面的一个方法依赖该线程的执行结果rnclass MyClassrn MyTask myTask=new MyTask();rn public void aMethod()rn while(!myTask.flag)rn continue;rn doOtherThing();rn rnrnrn该方法需要一直等到线程的flag属性为真时,才能做后续处理,否则就一直等待着。rnrn但是,用while循环这样一直等待,CPU占用率极高,请问大家有没有好的改进方法呢???rn多谢!rn
多线程-让线程执行变得可控
两个线程交替打印0~100的奇偶数: 偶线程:0 奇线程:1 偶线程:2 奇线程:3 ...... public class Test { public static void main(String[] args) { // 创建两条线程,奇数线程打印奇数,偶数线程打印偶数 Thread thread1 = new Thread(new ThreadTask(), &quot;偶数线...
如何控制线程执行的顺序?
如何控制线程执行的顺序? 先来一段多线程执行的代码。 public class Test { public static void main(String[] args) { Thread t1 = new Thread(new MyThread1()); Thread t2 = new Thread(new MyThread2()); Th...
如何知道线程执行完毕
我用CreateThread开启一个线程,主程序里要传个指针参数(new 出来的)rnrn该线程负责拷贝文件,我想知道怎么得知拷贝结束,这样好刷新文件信息rnrn自定义消息可以实现吗, 大家帮忙看看!!rnrn
如何控制线程执行的先后顺序
1.如果你有三个线程,分别为T1,T2,T3,如何让线程T2在线程T1之后执行,在线程T3之前执行。 答案是:使用线程的join方法,该方法的作用是“等待线程执行结束”,即join()方法后面的代码块都要等待现场执行结束后才能执行。事例代码如下: package com.liuan.job; public class Test { @SuppressWarnings(&quot;stati...
线程执行 Q&A
这里总结几个学习linux线程时遇到的一些问题,做以记录,仅供参考 Q:linux 线程的创建顺序和执行顺序有关系么? A:根据版本而定 老版本可能是先要执行子进程 最新的版本都是取决于进程调度算法 Q:linux里面线程编译运行问题 A:gcc  -o xxxx xxxx.c -lpthread Q: 线程创建顺序和执行顺序关系? A :线程间是并发执行的,也是交叉执行的
线程执行button_Click()
private void button1_Click(object sender, System.EventArgs e)rn rn label1.Text="csdn";rn rnprivate void timer1_Tick(object sender, System.EventArgs e)rn rn Thread ThreadOne=new Thread(new ThreadStart(button1_Click(null,null)));rn ThreadOne.Start();rn ThreadOne.Abort();rn rn这样不太对,如何写?
如何让javaScript代码在提交表单之后执行
rnrn rnrnrn rn rn 请输入信息内容: rnrnrnrnrnrnrnrnrn我的目的是先提交了文本框里的内容,再清除文本框的内容,可是这样写了之后先执行了Script代码部分,rnrn如果有更好的办法,谢谢提供!!!
线程执行中,如何让主窗体正常响应
在我的程序中,有一个发送数据线程、一个接受数据线程、一个处理数据的线程。发送数据和接受数据的线程在执行的时候都不影响主UI线程,在处理数据的时候,主界面上的按钮响应比较慢,我应该在处理数据的线程中做什么处理呀?三个线程的优先级都是Normal。
多线程,如何让每个线程执行不同的方法
如题,我有一程序,遍历找图,大概有一千张图片,用单个线程的话,找图太慢,于是想到用多线程,我的想法是每个线程遍历两百张图,可是如何控制每个线程找的图不一张呢,也就是我想写几个方法,把图区分开来,然后每个线程执行不同的方法。rnrn大概代码如下。。rn[code=C#]rnbool isFindPic = false;rn List threadList = new List();rn private void button1_Click(object sender, EventArgs e)rn rn for (int i = 0; i < 5; i++)rn rn Thread t = new Thread(FindPic);rn t.Start();rn threadList.Add(t);rn rnrn while (isFindPic)rn rn foreach (Thread t in threadList)rn t.Abort();rn rn Thread.Sleep(100);rn rnrn rnrn public void FindPic()rn rn if (*******)//遍历找图rn rn isFindPic = true;rn rn [/code]rn
可否在代码中指定线程执行在哪个CPU
目前的操作系统(windows)的CPU调度算法并不能充分利用多核优势(简单观测,双核CPU往往满负荷时,才50%,但鼠标响应已经有点困难了,同样,4核会是25%),所以,如果能够在程序中自己选择让线程运行在哪个CPU下,效果可能会更理想,但不知是否有这种可能,如何编码或有什么特殊指令呢?rn
关于java多线程中线程执行失败之后,后续执行的问题。
rn请教大家一个问题,自己想了很久也没想明白。rn麻烦各位了。rnrn这个是线程管理类。rnrnpackage com.sgcc.task;rnrnimport java.util.LinkedList;rnimport java.util.Queue;rnimport java.util.concurrent.ArrayBlockingQueue;rnimport java.util.concurrent.Callable;rnimport java.util.concurrent.CompletionService;rnimport java.util.concurrent.CountDownLatch;rnimport java.util.concurrent.Executors;rnimport java.util.concurrent.Future;rnimport java.util.concurrent.FutureTask;rnimport java.util.concurrent.RejectedExecutionHandler;rnimport java.util.concurrent.ScheduledExecutorService;rnimport java.util.concurrent.ScheduledFuture;rnimport java.util.concurrent.ThreadPoolExecutor;rnimport java.util.concurrent.TimeUnit;rnrnimport org.apache.log4j.Logger;rnrnimport weblogic.jws.security.RunAs;rnrnimport com.sgcc.task.TaskService.SendAddXML;rnimport com.sgcc.task.TaskService.SendCompleteTask;rnrnrnimport noNamespace.AddTaskBodyDocument;rnimport noNamespace.CompleteTaskBodyDocument;rnrnpublic class ThreadPoolManager rn private static Logger logger=Logger.getLogger("STDOUT");rn private CompleteTaskBodyDocument args;rn private String args2;rn private AddTaskBodyDocument doc;rn private StringBuffer args3;rn private String msg;rn private String send;rn public String getSend() rn return send;rn rnrnrn public void setSend(String send) rn this.send = send;rn rnrnrn public StringBuffer getArgs3() rn return args3;rn rnrnrn public void setArgs3(StringBuffer args3) rn this.args3 = args3;rn rnrnrn public AddTaskBodyDocument getDoc() rn return doc;rn rnrnrn public void setDoc(AddTaskBodyDocument doc) rn this.doc = doc;rn rnrnrn public String getMsg() rn return msg;rn rnrnrn public void setMsg(String msg) rn this.msg = msg;rn rnrnrn public CompleteTaskBodyDocument getArgs() rn return args;rn rnrnrn public void setArgs(CompleteTaskBodyDocument args) rn this.args = args;rn rnrnrn public String getArgs2() rn return args2;rn rnrnrn public void setArgs2(String args2) rn this.args2 = args2;rn rn rn rn rn private static ThreadPoolManager tpm = new ThreadPoolManager(); rn // 线程池维护线程的最少数量 rn private final static int CORE_POOL_SIZE = 50; rn // 线程池维护线程的最大数量 rn private final static int MAX_POOL_SIZE = 100; rn // 线程池维护线程所允许的空闲时间 rn private final static int KEEP_ALIVE_TIME = 10; rn // 线程池所使用的缓冲队列大小 rn private final static int WORK_QUEUE_SIZE = 500; rn rn rn //ThreadPoolExecutor.DiscardPolicy不能执行的任务将被删除rn // 管理数据库访问的线程池 rn final ArrayBlockingQueue queue=new ArrayBlockingQueue( WORK_QUEUE_SIZE );rn final ThreadPoolExecutor threadPool = new ThreadPoolExecutor( rn CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, rn queue, new ThreadPoolExecutor.DiscardPolicy(); rnrn rn public static ThreadPoolManager newInstance()rn return tpm;rn rn rnrn public ThreadPoolManager() rnrn//发送代办rn public void SendMsg( AddTaskBodyDocument doc,StringBuffer args3,String msg,String send) rn rn this.doc=doc;rn this.args3=args3;rn this.msg=msg;rn this.send=send;rn Runnable task = new TaskService().new SendAddXML(doc,args3,msg); rn System.out.println("池中当前线程数 :"+threadPool.getPoolSize()+" >>>>>> "+"当前代办队列 :"+queue.size());rn threadPool.execute( task ); rn rn rn rn rn rn rnrnrn这个线程管理类用来 接收 业务系统代办信息,和根据代办信息中的往生表示 分发至各个网省。rnrnrn在本机测试,业务系统发送2000条代办信息的时候,也能到网省分发成功。rnrn比如 某个系统发 协同办公代办 2000条,发到四川省(四川部署了代办接收包)。rnrn那么在 接收系统发送代办的同时也在往四川发送。rnrn此期间 如果四川服务器突然停了。就出现了一个问题。rnrn当前线程中还未分发成功的代办 ,因为发送失败 ,就会丢弃。rnrn导致数据丢失。。rnrn具体是这样的。rnA代表业务系统发送包,B带表我这里的接受分发包,C代表网省接收包。rnrnA发给B,B在发给C。rnrnB接收A后,将数据先存在一张零时表t1中。然后根据这个表内容组合xml发送给C,成功则 在将数据存在t2中,rnrn失败则存在t3中。rnrnrn测试,当A给B发2000条代办。同时B转发给C的,期间C服务器突然停了。rnrn结果是:t1中1500条。t2中1500条。t3中500条。 没有问题。t1失败一条就删除1条,所以也是1500条。t2代表发送完成。t3代表失败。rnrnC端 数据库,接收数据位1200条。 加上发送失败的500条也才1700条。rnrn请问 还有300条在哪里去了?rnrn是不是因为线程执行没有结果则丢弃当前任务造成的。因为丢弃了,就没有返回值了还是怎么的。rnrn总之我也不清楚这个怎么回事。。rnrn请各位帮我解答下。。谢谢了。rnrnrn rn
C#开启新线程执行方法
1.创建新的线程并传入指定的参数 Thread thread = new Thread(new ParameterizedThreadStart(RunRefreshProjectMoneyAndOtherMoney)); object[] paramObj = { Token, source.KeyID }; thread.Start(paramObj); 2.执行方法接收线程参数 v
线程池等待一定数目的线程执行完毕之后返回结果
线程池
Android子线程中直接回到UI线程执行
public void runInUiThread(Runnable r) { if (Thread.currentThread() == Looper.getMainLooper().getThread()) { r.run(); } else { Handler handler = new Handler(Looper.getMainLooper
Android UI 线程执行操作的三种方式
使用 HandlerHandler 收到 message 时处理逻辑所在的线程由创建时所在的线程决定或者可以通过制定 Handler 的 Looper 来决定(Looper 属于哪个线程,则代码在哪个线程执行) 因此,有两种方式实现 Handler 在主线程执行逻辑方法一在主线程创建一个 Handler(mHandler),然后在其他线程通过 mHandler 发消息方法二new Handle
C#中如何让线程执行带有参数的函数
在C#中,如何让线程执行带有参数的函数?
winform 阻止线程执行上下文流动源码
winform 阻止线程执行上下文流动源码! 很值得下载看看!资源免费,大家分享!!
如何等待一个线程执行完毕?
我写了一个网络蜘蛛的程序,原来没有分线程时在进行叶面搜索的时候速度比较慢,rnCPU资源占用了100%,后来为了在进行搜索的时候可以进行别的工作,我吧搜索这一部分写入一个线程的Execute()里面rnfor(int i=0;iFreeOnTerminate=true;//等待rnrn请问如何做可以使得程序在线程没有结束时循环不会继续进行下去,而是在此等待? rn
async awit 实现axios继发与并发
在使用async awit之前先确定项目支不支持(不支持报regeneratorRuntime is not defined) 使用webpack搭建的项目可使用这里提供webpack配置支持 使用babel-preset-stage-3、babel-polyfill 或babel-plugin-transform-runtime 注意babel v6、v7版本配置稍有不同 继发...
如何判断一个线程执行完毕?
如何判断一个线程执行完毕?
如何获的线程执行的方法的返回值?
客户端的并发量很大,需要从服务端读内存中的数据,我想在服务端通过多线程从内存中读出数据(每请求一个线程),但线程中好象没有办法获取函数、方法执行的返回值。rn大虾有何高招?
如何等待一个线程执行完毕后再执行下面的代码?
实际业务中需要等待一个线程结束并拿到结果后再执行后面的程序,我试过一些方法都不行,请各位大神帮忙看看错在哪里。rnrn[code=csharp]rn ///点击按钮后,启动线程,调用执行函数test()rn private void btn_Click(object sender, EventArgs e)rn rnrn Thread th = new Thread(test);rn th.IsBackground = true;rn th.Start();rn th.Join();///我用了join方法,结果程序就卡死了rnrn MessageBox.Show("线程执行完毕", "提示");rnrn rnrnrn public void test()rn rn while (flag)//flag是一个循环开关,判断是否结束循环rn rn if (满足条件)rn rn flag = false;rn rnrn Thread.Sleep(3000);rn rn rn[/code]rnrn希望等线程test方法执行完毕后,在执行MessageBox.Show("线程执行完毕", "提示");rn但实际上发现不行,我尝试了join方法,结果程序就卡死了。rn请问这种情况该怎么处理,谢谢!
java中线程执行顺序控制
java中线程执行顺序控制
相关热词 c# login 居中 c# 考试软件 c# 自然语言分析 c# 分段读取文件 c# 泛型反射 c#打断点 c# 时间转多少秒 c# 线程函数加参数 c# modbus 读取 c#查询集合表