繁体   English   中英

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

[英]Control is not waiting till the thread finish its work

下面是我的代码,
我知道它不是很好的编码实践,只是创建一个模板来模拟带有参数和返回值的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()调用完成吗?

processTable与本地dh变量一起使用,而与全局dh变量无关

因此, Rows[i][3]指的是[i] -s行的第四列,该列不存在。

这就是例外。

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

   public static  data_holder dh = new data_holder();

并按预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM