Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用参数和返回值组合线程_C#_Multithreading - Fatal编程技术网

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线程池借用现有线程