所以我最近一直在多线程,因为我刚接触到这个我可能做了一些基本的错误..
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);
}
我不知道如何将两者结合起来。
返回值将是一个字符串。
谢谢你帮助一个新手,我尝试将它们结合起来,但由于我缺乏经验而得到了错误编辑:
我的主题:
public void threadmain(string url,string search,string 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);
}
}
答案 0 :(得分:2)
一个简单的解决方案是对异步操作使用另一级抽象:Tasks。
示例:
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
除了task.Result
之外,您还可以使用await task
(异步/等待模式)或task.Wait
(+超时和/或取消令牌)等待任务。
答案 1 :(得分:1)
线程实际上不应该像函数一样运行。您找到的代码仍然缺乏读/写输出变量的同步/线程安全性。
Task Parallel Library提供了更好的抽象,Tasks。
然后可以通过类似的代码解决您的问题:
var result = await Task.Run(() => MethodReturningAValue());
这样的运行任务实际上更轻量级,因为它只从SynchronizationContext或.NET线程池中借用现有线程,开销很低。
我强烈建议Stephen Cleary's blog series使用并行和异步的任务。它应该回答你所有进一步的问题。