C# 中线程函数使用多个参数,并且得到返回值问题

我想使用线程写数据到数据库,所以想使用线程,不想影响主界面的使用。我的写入数据库的函数,里面有几个参数,我同时想得到返回值,以便指导,函数是不是执行成功,这个该怎么弄,谁... 我想使用线程写数据到数据库,所以想使用线程,不想影响主界面的使用。我的写入数据库的函数,里面有几个参数,我同时想得到返回值,以便指导,函数是不是执行成功,这个该怎么弄,谁给个简单详细的例子呀
我是新手,我想请问下,调用异步,可以有子线程的优势吗,就是会不会影响到主界面的使用
展开
 我来答
掌烟波庚
2019-11-07 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.2万
采纳率:25%
帮助的人:1029万
展开全部
如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了
变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~
如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~
其实你这个思路是错误的:
根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。
1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个threadtryrequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。
2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~
你可以说一下你的目的是什么吗?
就你的描述来看,你根本没必要用线程。。。
从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。
如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。
总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。
===================================================================
public
string
threadtryrequest(string
strurl,
string
parm)
{
thread
throne
=
new
thread(this.threadproc);
//创建线程
threadparameter
parameter
=
new
threadparameter();
//实例化threadparameter对象,并赋值
parameter.strurl
=
strurl.tostring();
parameter.parm
=
parm.tostring();
throne.start(parameter);
//开启线程
return
strstate;
//返回字符串
}
你想在这里就获取到值?
那是获取不到的....
return
strstate;
执行了
this.threadproc(parameter)
还没执行完了,这个时候strstate
还没被赋值,
所以我说你的思路是错误的....
你想当时就知道一个线程的执行结果,除非你等~~~
要不获取不到的~~~
149032105
推荐于2016-07-10 · TA获得超过756个赞
知道小有建树答主
回答量:1029
采纳率:0%
帮助的人:670万
展开全部
异步是吧
看代码

//声明一个委托
public delegate string AddHandler(int a, string b);//你要多少个参数在这里定义,此例只有两个参数

void 调用异步()
{

AddHandler handler = new AddHandler(Add);

//用BeginInvoke开始异步操作 这里的 1,"字符串",这两个参数就是对应(int a, string b)
IAsyncResult result = handler.BeginInvoke(1, "字符串", new AsyncCallback(AddComplete),"这里是随便你写个什么对象");

}

static int Add(int a, string b)
{
//这里是处理的的函数
Thread.Sleep(3000);//模拟耗时操作
return b+a.ToString();
}

static void AddComplete(IAsyncResult result)
{
AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;

//调试一下就会明白了
MessageBox.Show(handler.EndInvoke(result));
MessageBox.Show(result.AsyncState);
}

如果这么详细的例子还不懂~那估计没办法了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
最后的仙人
推荐于2016-07-12 · TA获得超过1961个赞
知道大有可为答主
回答量:1509
采纳率:0%
帮助的人:1404万
展开全部
定义一个Stuct来存放这几个参数,然后在thread.Start(object);中用这个结构体启动,返回值的话定义一个全局的bool型变量来表示吧
private void button1_Click(object sender, EventArgs e)
{
dataStored ds = new dataStored();
ds.para1 = "1";
ds.para2 = "2";
ds.para3 = "3";
ds.para4 = "4";
ParameterizedThreadStart threadstart = new ParameterizedThreadStart(test);
Thread th = new Thread(threadstart);
th.Start(ds);
}
//private delegate void my();
public struct dataStored
{
public String para1;
public String para2;
public String para3;
public String para4;
};
private void test(object dp)
{
while (true)
{
t((dataStored)dp);
}
}
bool flag = false;
private void t(dataStored dp)
{
SqlConnection sqlcon = new SqlConnection();
SqlCommand cmd = new SqlCommand("insert into table(para1,para2,para3,para4) values(" + dp.para1 + "," + dp.para2 + "," + dp.para3 + "," + dp.para4+ ")",sqlcon);
sqlcon.Open();
if (cmd.ExecuteNonQuery() > 0)
{
flag = true;
}
else
{
flag = false;
}
sqlcon.Close();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xpcn04
2009-07-31 · TA获得超过965个赞
知道大有可为答主
回答量:2978
采纳率:0%
帮助的人:1599万
展开全部
public string[你好返回的值的类型] func[方法名](参数类型 参数,参数类型1 参数,参数类型2 参数){

........

return 最终的数据
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
talencz
2009-07-31 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:140万
展开全部
线程传递参数:你可以先创建数据库集合对象,然后使用线程的ParameterizedThreadStart委托,启动线程时将集合对象传递给函数方法。Thread.Start(Object)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式