C#中 多线程执行含有返回值的函数

-------------2017-06-09 更新-----------------------------------

 如果你想不阻塞主线程地执行某个任务,并想在该任务结束时把结果显示在界面上,可以使用:

方法1:使用binding,在线程中改变结果值时手动notify。

方法2:使用ContinueWith

方法3:使用await、async

 

 

 

 

 

以下方法是个人的土办法,已经过时了。。

=================================================================================================================

C# 中,传统的多线程并不支持多线程执行含有返回结果的函数。虽然可以通过制作外壳类来使得返回结果得以保留,但如果一定时间内函数未执行完,简单的外壳类可能就无法满足需求了。

 

 class netHelper
    {
        public static string sendResult = "";

        public void yourFunction(Object obj)
        {
            Thread.Sleep(10000);
    
            sendResult = "the result after excuted";
        }
    }  

如此一来,只要我们先多线程调用yourFunction,就可以在sendResult里获得结果。

那么问题来了,如过实际的函数像我上面写的一样,含有一个非常耗时间的操作,那么我们用来存储执行结果的变量可能就还没来得及被赋值,而什么时候能得到返回结果、有返回结果之后如何获得,也是个问题。

 

第二个是使用Task。

 

Task<string> yourTask = new Task<string>(()=>{Thread.Sleep(10000); MessageBox.Show("afterthis i go");} );

yourTask.Start();

string result = yourTask.result;

Task内部虽然保证了result只有在有结果的时候才会被赋值,但是同样,如果这个函数的执行时间非常长,你又在父级里调用了yourTask.Result,那么task就相当于阻塞运行;如果父进程是个ui进程,ui还会卡死。

 

解决方案是,新建一个线程,专门等待Task的返回结果,有结果返回再保存什么的。问题解决。

posted @ 2016-10-21 10:51  Et0l1A  阅读(10589)  评论(2编辑  收藏  举报