C# 使用参数和返回值组合线程
所以我最近一直在使用多线程,由于我是新来的,我可能做错了一些基本的事情C# 使用参数和返回值组合线程,c#,multithreading,C#,Multithreading,所以我最近一直在使用多线程,由于我是新来的,我可能做错了一些基本的事情 Thread mainthread = new Thread(() => threadmain("string", "string", "string")); mainthread.Start(); 上面的代码可以完美地工作,但是现在我想从我的线程中得到一个值。 为此,我搜索了SO并找到以下代码: object value = null; var thread = new Thread( () =&
Thread mainthread = new Thread(() => threadmain("string", "string", "string"));
mainthread.Start();
上面的代码可以完美地工作,但是现在我想从我的线程中得到一个值。
为此,我搜索了SO并找到以下代码:
object value = null;
var thread = new Thread(
() =>
{
value = "Hello World";
});
thread.Start();
thread.Join();
MessageBox.Show(value);
}
我不知道如何将两者结合起来
返回值将是一个字符串
谢谢你帮助一个新手,我试着把它们结合起来,但是由于缺乏经验而出错了
编辑:
我的帖子:
公共void threadmain(字符串url、字符串搜索、字符串regexstring)
{
using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
{
string allthreadusernames = "";
string htmlCode = client.DownloadString(url);
string[] htmlarray = htmlCode.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in htmlarray)
{
if (line.Contains(search))
{
var regex = new Regex(regexstring);
var matches = regex.Matches(line);
foreach (var singleuser in matches.Cast<Match>().ToList())
{
allthreadusernames = allthreadusernames + "\n" + singleuser.Groups[1].Value;
}
}
}
MessageBox.Show(allthreadusernames);
}
}
使用(WebClient=newWebClient())//WebClient类继承IDisposable
{
字符串allthreadusernames=“”;
字符串htmlCode=client.DownloadString(url);
string[]htmlarray=htmlCode.Split(新字符串[]{“\n”,“\r\n”},StringSplitOptions.RemoveEmptyEntries);
foreach(htmlarray中的字符串行)
{
if(行包含(搜索))
{
var regex=新的regex(regexstring);
var matches=regex.matches(行);
foreach(matches.Cast().ToList()中的var singleuser)
{
allthreadusernames=allthreadusernames+“\n”+singleuser.Groups[1]。值;
}
}
}
MessageBox.Show(所有线程用户名);
}
}
一个简单的解决方案是对异步操作使用另一个抽象级别:
例如:
public static int Calculate()
{
// Simulate some work
int sum = 0;
for (int i = 0; i < 10000; i++)
{
sum += i;
}
return sum;
}
// ...
var task = System.Threading.Tasks.Task.Run(() => Calculate());
int result = task.Result; // waits/blocks until the task is finished
public static int Calculate()
{
//模拟一些工作
整数和=0;
对于(int i=0;i<10000;i++)
{
总和+=i;
}
回报金额;
}
// ...
var task=System.Threading.Tasks.task.Run(()=>Calculate());
int result=task.result;//等待/阻止,直到任务完成
除了
task.Result
,您还可以使用wait task
(异步/等待模式)或task.wait
(+超时和/或取消令牌)等待任务。一个简单的解决方案是为异步操作使用另一个抽象级别:
例如:
public static int Calculate()
{
// Simulate some work
int sum = 0;
for (int i = 0; i < 10000; i++)
{
sum += i;
}
return sum;
}
// ...
var task = System.Threading.Tasks.Task.Run(() => Calculate());
int result = task.Result; // waits/blocks until the task is finished
public static int Calculate()
{
//模拟一些工作
整数和=0;
对于(int i=0;i<10000;i++)
{
总和+=i;
}
回报金额;
}
// ...
var task=System.Threading.Tasks.task.Run(()=>Calculate());
int result=task.result;//等待/阻止,直到任务完成
除了
task.Result
,您还可以使用wait task
(异步/等待模式)或task.wait
(+超时和/或取消令牌)等待任务。一个简单的解决方案是为异步操作使用另一个抽象级别:
例如:
public static int Calculate()
{
// Simulate some work
int sum = 0;
for (int i = 0; i < 10000; i++)
{
sum += i;
}
return sum;
}
// ...
var task = System.Threading.Tasks.Task.Run(() => Calculate());
int result = task.Result; // waits/blocks until the task is finished
public static int Calculate()
{
//模拟一些工作
整数和=0;
对于(int i=0;i<10000;i++)
{
总和+=i;
}
回报金额;
}
// ...
var task=System.Threading.Tasks.task.Run(()=>Calculate());
int result=task.result;//等待/阻止,直到任务完成
除了
task.Result
,您还可以使用wait task
(异步/等待模式)或task.wait
(+超时和/或取消令牌)等待任务。一个简单的解决方案是为异步操作使用另一个抽象级别:
例如:
public static int Calculate()
{
// Simulate some work
int sum = 0;
for (int i = 0; i < 10000; i++)
{
sum += i;
}
return sum;
}
// ...
var task = System.Threading.Tasks.Task.Run(() => Calculate());
int result = task.Result; // waits/blocks until the task is finished
public static int Calculate()
{
//模拟一些工作
整数和=0;
对于(int i=0;i<10000;i++)
{
总和+=i;
}
回报金额;
}
// ...
var task=System.Threading.Tasks.task.Run(()=>Calculate());
int result=task.result;//等待/阻止,直到任务完成
除了
task.Result
,您还可以使用wait task
(异步/等待模式)或task.wait
(+超时和/或取消令牌)等待任务。线程的行为实际上不应该像函数一样。您发现的代码仍然缺乏读取/写入输出变量的同步/线程安全性
提供更好的抽象
然后,您的问题可以通过类似以下代码解决:
var result = await Task.Run(() => MethodReturningAValue());
运行这样的任务实际上更加轻量级,因为它只从SynchronizationContext或.NET线程池借用现有线程,开销较低
我强烈建议使用任务来实现并行性和异步性。它应该能回答你所有进一步的问题。线程的行为实际上不应该像函数一样。您发现的代码仍然缺乏读取/写入输出变量的同步/线程安全性 提供更好的抽象 然后,您的问题可以通过类似以下代码解决:
var result = await Task.Run(() => MethodReturningAValue());
运行这样的任务实际上更加轻量级,因为它只从SynchronizationContext或.NET线程池借用现有线程,开销较低
我强烈建议使用任务来实现并行性和异步性。它应该能回答你所有进一步的问题。线程的行为实际上不应该像函数一样。您发现的代码仍然缺乏读取/写入输出变量的同步/线程安全性 提供更好的抽象 然后,您的问题可以通过类似以下代码解决:
var result = await Task.Run(() => MethodReturningAValue());
运行这样的任务实际上更加轻量级,因为它只从SynchronizationContext或.NET线程池借用现有线程,开销较低
我强烈建议使用任务来实现并行性和异步性。它应该能回答你所有进一步的问题。线程的行为实际上不应该像函数一样。您发现的代码仍然缺乏读取/写入输出变量的同步/线程安全性 提供更好的抽象 然后,您的问题可以通过类似以下代码解决:
var result = await Task.Run(() => MethodReturningAValue());
运行这样的任务实际上更轻量级,因为它只从SynchronizationContext或.NET线程池借用现有线程