C# 多线程获取返回值问题

C# 多线程获取返回值问题,第1张

如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了

变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~

如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~

其实你这个思路是错误的:

根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。

1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。

2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~

你可以说一下你的目的是什么吗? 就你的描述来看,你根本没必要用线程。。。

从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。 如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。

总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。

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

public string ThreadTryRequest(string strUrl, string parm)

{

Thread thrOne = new Thread(thisThreadProc); //创建线程

ThreadParameter parameter = new ThreadParameter(); //实例化ThreadParameter对象,并赋值

parameterStrUrl = strUrlToString();

parameterparm = parmToString();

thrOneStart(parameter); //开启线程

return strState; //返回字符串

}

你想在这里就获取到值 那是获取不到的 return strState; 执行了

thisThreadProc(parameter) 还没执行完了,这个时候strState 还没被赋值,

所以我说你的思路是错误的

你想当时就知道一个线程的执行结果,除非你等~~~ 要不获取不到的~~~

以你的演示代码可以使用

GetExitCodeThread方法,仅限windows平台

不过这样有限制,只能是unsigned int类型,或者是能强制转换为此类型的类型

可以用其他方法来获取

如:

unsigned int threadres = 0;

unsigned int __stdcall Fun(void pPM); //线程函数

{

int _in = (int)pPM;

threadres = do_sth(_in);

return 0;

}

void main()

{

handle = (HANDLE)_beginthreadex(NULL, 0, Fun, &parm, 0, NULL);

WaitForSingleObject( handle, INFINITE);

unsigned int a = threadres;

}

但是要保证threadres的生命周期要大于线程的生命周期,不然就有问题

_endthreadex这作用是结束当前线程

unsigned int __stdcall Fun(void pPM); //线程函数

{

int _in = (int)pPM;

_endthreadex();//线程在这里结束,后边不会运行了

return do_sth(_in);

}

是有死循环, 估计你是把if写成while了吧? 条件判断符号== 写成=了。我给你改了一下,你看看是不是你要的。

#include "iostream"

using namespace std;

#include "cmath"

void main()

{

int i=0,j=0;

double thita[8]=,

x[8]=,

y[8]=,

a[8]=,

b[8]=,

S=04142,

A,B,E,

I[8][8],ln[8],aatan[8];

for(i=0;i<=7;i++)

{

for(j=0;j<=7;j++)

{

if(i==j)

I[i][j]=31416;

else

{

A=0-(x[i]-a[j])cos(thita[j])-(y[i]-b[j])sin(thita[j]);

B=(x[i]-a[j])(x[i]-a[j])+(y[i]-b[j])(y[i]-b[j]);

E=(x[i]-a[j])sin(thita[j])-(y[i]-b[j])cos(thita[j]);

ln[j]=log(1+(SS+2AS)/B);

aatan[j]=atan((S+A)/E)-atan(A/E);

I[i][j]=05sin(thita[i]-thita[j])ln[j]-cos(thita[i]-thita[j])aatan[j];

}

cout<<I[i][j]<<" ";

if(j == 7)

cout<<endl;

}

if(i == 7)

cout<<endl;

}

}

#include <Windowsh>

#include <iostream>

#include <stdioh>

using namespace std;

DWORD WINAPI ThreadPro(LPVOID lpParamter);

BOOL bRunning = TRUE;

int main()

{

HANDLE hThread = CreateThread(NULL,0,ThreadPro,0,0,NULL);

DWORD dwExitCode;

GetExitCodeThread(hThread,&dwExitCode);

printf("0x%08X\n",dwExitCode);

system("pause");

bRunning = FALSE;

system("pause");

GetExitCodeThread(hThread,&dwExitCode);

printf("0x%08X\n",dwExitCode);

system("pause");

CloseHandle(hThread);

return 0;

}

DWORD WINAPI ThreadPro(LPVOID lpParamter)

{

while(bRunning)

{

Sleep(1000);

}

return 4L;

}

这个代码给你参考,线程的创建和销毁过程还是很复杂的,想要深入一点了解的话,再问我吧!

如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了

变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~

如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~

其实你这个思路是错误的:

根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。

1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。

2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~

你可以说一下你的目的是什么吗?

就你的描述来看,你根本没必要用线程。。。

从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。

如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。

总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。

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

public

string

ThreadTryRequest(string

strUrl,

string

parm)

{

Thread

thrOne

=

new

Thread(thisThreadProc);

//创建线程

ThreadParameter

parameter

=

new

ThreadParameter();

//实例化ThreadParameter对象,并赋值

parameterStrUrl

=

strUrlToString();

parameterparm

=

parmToString();

thrOneStart(parameter);

//开启线程

return

strState;

//返回字符串

}

你想在这里就获取到值

那是获取不到的

return

strState;

执行了

thisThreadProc(parameter)

还没执行完了,这个时候strState

还没被赋值,

所以我说你的思路是错误的

你想当时就知道一个线程的执行结果,除非你等~~~

要不获取不到的~~~

以上就是关于C# 多线程获取返回值问题全部的内容,包括:C# 多线程获取返回值问题、C++ 线程 返回值、C++ 线程返回值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9518946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存