多线程:子线程执行过程中调用主线程

直接在子线程中调用方法,线程的ID为3,通过Post则为1

执行结果:

2018-09-13 11:21:11:1735 : 主线程:1

2018-09-13 11:21:16:0583 : 子线程:3

2018-09-13 11:21:16:0739 : ShowForm:1发送失败!

2018-09-13 11:21:16:1051 : ShowForm:3发送失败!

 public class TestClass
    {

        private SynchronizationContext mainThreadSynContext;
        public void SendTestResult(string Url, string TestResult)
        {
            mainThreadSynContext = SynchronizationContext.Current;
            Thread t = new Thread(p => Start(Url, TestResult));
            t.Start();
            LogWriteUtility.Instance.LogWrite("主线程:"+Thread.CurrentThread.ManagedThreadId.ToString());
        }

        private void Start(string url, string testResult)
        {
            try
            {
                Thread.Sleep(TimeSpan.FromSeconds(5));
                LogWriteUtility.Instance.LogWrite("子线程:" + Thread.CurrentThread.ManagedThreadId.ToString());
                throw new Exception("发送失败!");
            }
            catch (Exception ex)
            {
                //SendOrPostCallback myDelegate;
                //myDelegate = new SendOrPostCallback(ShowForm);
                mainThreadSynContext.Post(ShowForm, ex);
                this.ShowForm(ex);
            }
        }

        private void ShowForm(object state)
        {
            Exception ex = state as Exception;
            LogWriteUtility.Instance.LogWrite("ShowForm:" + Thread.CurrentThread.ManagedThreadId.ToString()+ex.Message);
            //ErrorForm form = new ErrorForm();
            //form.ShowDialog();
        }
    }

原文地址:https://www.cnblogs.com/sportdog/p/9639480.html

时间: 2024-08-02 21:39:57

多线程:子线程执行过程中调用主线程的相关文章

如何获得JVM执行过程中调用的方法名

这应该分成两个问题,1.如何获取参数值. 2.如何获取参数名, 1.如何获取参数值.这个是运行时的数据,你程序处理下获取就好了.比如写一个代理 2.参数名是在编译的时候就写入到class文件的.,而这些方法的参数在class中就是一个局部变量.class对于局部变量的定义和存储专门有张表. 单纯通过反射目前好像没有办法,通过字节码解析倒是可以 比如下面代码 public static void staticMethod(String args1, String args2) { } 局部变量表:

多线程 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次

package Thread; /** * 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次 * 父线程main线程则为Console台项目的主线程 * 在main线程中调用了start线程则为子线程 * */ public class FatherAndSonTest { public static void main(String[] args) { final FatherAndSon fs = new FatherAndSon(); new Thread(new R

只能在执行Render() 的过程中调用 RegisterForEventValidation;

October 17, 2008  3:28 PMMarch 29, 2013  8:28 PM Aillo 编程   0 Comments 在实现"将GridView中的数据导出到Excel中"的时候出现了如下错误: 用户代码未处理 InvalidOperationException 只能在执行 Render() 的过程中调用 RegisterForEventValidation: EnableEventValidation属性是 .NET Framework 2.0 中是新增的属性

只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render();

只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render(); 当用GridView导出Execl的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误提示.有两种方法可以解决以上问题:1.修改web.config(不推荐)<pages enableEventValidatio

Error 之 只能在执行Render() 的过程中调用 RegisterForEventValidation;

在实现"将GridView中的数据导出到Excel中"的时候出现了如下错误: 用户代码未处理 InvalidOperationException 只能在执行 Render() 的过程中调用 RegisterForEventValidation: EnableEventValidation属性是 .NET Framework 2.0 中是新增的属性,默认的情况下该属性的值为true:通过这个新增的功能ASP.NET会检查 POST方法中的所带的参数,如果认为不合法,就会抛出异常.这个设计

"只能在执行Render()的过程中调用RegisterForEventValidation" 解决方案

开发中遇到令人蛋疼的问题: 只能在执行Render()的过程中调用RegisterForEventValidation 当出现的异常的提示: 异常详细信息: System.InvalidOperationException:只能在执行Render()的过程中调用RegisterForEventValidation: 不要伤心,下面是解决办法: 出现这个异常,解决问题只需要在<%@ Page %> 指令中加上 EnableEventValidation="false" &qu

面试题,子线程10次子线程2执行20次与主线程100次来回循环执行50次

// 面试题,子线程2执行10次子线程2执行20次 与主线程100次来回循环执行50次 public class interview { public static void main(String[] args) { final Business b = new Business(); new Thread(new Runnable(){ @Override public void run() { for (int i = 1; i <= 50; i++) { b.sub2(i); } } }

问题:只能在执行 Render() 的过程中调用 RegisterForEventValidation;结果:只能在执行 Render() 的过程中调用 RegisterForEventValidation

只能在执行 Render() 的过程中调用 RegisterForEventValidation 当在导出Execl或Word的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误提示.下面的2中方法是在网上找到的,没有应用:1.修改web.config(不推荐) <pages enableEventValidation ="false" ></pages> 2.直接在导出Execl的页面修改 <

Effective C++ 条款九、十 绝不在构造和析构过程中调用virtual函数|令operator=返回一个reference to *this

  1.当在一个子类当中调用构造函数,其父类构造函数肯定先被调用.如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始化,所以无法调用子类与之对应的函数.即为指向虚函数表的指针vptr没被初始化又怎么去调用派生类的virtual函数呢?析构函数也相同,派生类先于基类被析构,又如何去找派生类相应的虚函数? 2.做法:将子类的某个函数改为non-virtual,然后在子类构造函数中传递参数给父类函数.然后父类的构造函数