在另一个线程运行时延迟主线程

时间:2015-01-28 16:52:10

标签: c# multithreading

我想在自己的线程中导入CSV文件。在导入和处理文件时,我想延迟/停止主线程,直到处理结束。请参阅以下代码:

// Read from CSV file in a seperate thread
new Thread(() =>
{
    Thread.CurrentThread.IsBackground = true;

    reader = new CSVReader(myFile);
    reader.DataReader();


    // Get temperature and time data from CSV file
    // and copy the data into each List<String>
    Temperature = new List<string>(reader.GetTemperature());
    Time = new List<string>(reader.GetTime());

}).Start();

// Bind data to GridView
dtgCsvData.ItemsSource = Time.Zip(Temperature, (t, c) => new { Time = t, Temperature = c });

当应用程序运行时发生错误,因为两个列表为空。

我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

你可能真的不想停止主线程。如果这是一个GUI应用程序,您仍然希望主UI线程响应Windows消息等。你想要的是在读取数据后运行那段代码。为什么不在工作线程读取数据后调用它?

答案 1 :(得分:0)

这是使用linqpad创建的......您可以使用任务或async关键字,如下所示。

void Main()
{   
    Task<TimeAndTemp> timeAndTempTask = GetTimeAndTemp();
    timeAndTempTask.ContinueWith (_ => 
        {
            timeAndTempTask.Result.Time.Dump();
            timeAndTempTask.Result.Temperature.Dump();
        }); 
}

Task<TimeAndTemp> GetTimeAndTemp()
{
    var tcs = new TaskCompletionSource<TimeAndTemp>();

    new Timer (_ => tcs.SetResult (new TimeAndTemp())).Change (3000, -1);

    return tcs.Task;
}

public class TimeAndTemp
{
    public DateTime Time = DateTime.Now;
    public int Temperature = 32;
}

使用async等待关键字的异步版本。

async void Main()
{   
    TimeAndTemp tt = await GetTimeAndTemp();

    tt.Time.Dump();
    tt.Temperature.Dump();
}

async Task<TimeAndTemp> GetTimeAndTemp()
{
    return new TimeAndTemp();
}

public class TimeAndTemp
{
    public DateTime Time = DateTime.Now;
    public int Temperature = 32;
}