将Thread与参数和返回值组合在一起

时间:2015-03-05 13:29:45

标签: c# multithreading

所以我最近一直在多线程,因为我刚接触到这个我可能做了一些基本的错误..

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);

    }

}

2 个答案:

答案 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使用并行和异步的任务。它应该回答你所有进一步的问题。