控制不会等到线程完成其工作

时间:2017-03-24 11:59:59

标签: c# multithreading

以下是我的代码,
我知道它不是很好的编码实践,只需创建一个模板来模拟thread处理参数和返回值
它在调用函数完成之前到达最后一行的问题,导致exception

public class data_holder
{
    public DataTable dtable = new DataTable();
    public DataTable dt = new DataTable();
}
class Program
{
    public static List<int> int_list1 = new List<int>();
    public static List<int> int_list2 = new List<int>();
    public static bool done = false;

    static void Main(string[] args)
    {
        data_holder dh = new data_holder();
        dh.dtable.Columns.Add("Id", typeof(string));
        dh.dtable.Columns.Add("DOB", typeof(DateTime));
        dh.dtable.Columns.Add("Refno", typeof(string));

        for (int i = 0; i <= 10; i++)
        {
            DataRow dr = dh.dtable.NewRow();
            dr["Id"] = i.ToString();
            dr["DOB"] = DateTime.Now.AddDays(i);
            dr["Refno"] = new Guid();
            dh.dtable.Rows.Add(dr);
        }
        StringBuilder sb = new StringBuilder();
        ThreadStart ts = new ThreadStart(processTable);
        Thread t1 = new Thread(ts);
        t1.Start();
        t1.Join();
        if (done == true)
        //while(!done)
        {
            for (int i = 0; i < dh.dtable.Rows.Count; i++)
            {
                sb.Append(dh.dtable.Rows[i][0].ToString());
                sb.Append("    ");
                sb.Append(dh.dtable.Rows[i][1].ToString());
                sb.Append("    ");
                sb.Append(dh.dtable.Rows[i][2].ToString());
                sb.Append("    ");
                sb.Append(dh.dtable.Rows[i][3].ToString());
                sb.Append("    ");
                sb.Append(dh.dtable.Rows[i][4].ToString());
                sb.Append("    ");
                sb.Append(dh.dtable.Rows[i][5].ToString());
                sb.Append(Environment.NewLine);
            }
            Console.WriteLine(sb.ToString());
            Console.ReadLine();
        }
        Console.WriteLine(sb.ToString());
        Console.ReadLine();
    }

    static void processTable()
    {
        data_holder dh = new data_holder();
        dh.dtable.Columns.Add("col1", typeof(string));
        dh.dtable.Columns.Add("col2", typeof(string));
        dh.dtable.Columns.Add("col3", typeof(string));
        for (int i = 0; i < dh.dtable.Rows.Count; i++)
        {
            dh.dtable.Rows[i]["col1"] = "col_1_Dummy";
            dh.dtable.Rows[i]["col2"] = "col_2_Dummy";
            dh.dtable.Rows[i]["col3"] = "col_3_Dummy";
        }
        done = true;                   
    }}

显示错误
sb.Append(dh.dtable.Rows[i][3].ToString());
  

错误:{“找不到第3列。”}


我知道它是因为datatable还没有准备好,在执行processTable()之前不应该执行控制吗?

2 个答案:

答案 0 :(得分:0)

HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("your url"); myHttpWebRequest.Timeout = 1000 ; 适用于本地processTable变量,不对全局dh变量执行任何操作

所以dh指的是Rows[i][3] - s行的第四列,它不存在。

那是什么例外。

答案 1 :(得分:0)

这是解决方案
信用@vyrp
有两个data_holder实例,这就是创建问题 声明为

   public static  data_holder dh = new data_holder();

它可以满足期望。