Передающие данные в метод обратного вызова (через BeginInvoke) в c#

Используя метод, который вы показываете здесь, вы добавляете по одной строке за раз. Таким образом, сервер открывает соединение с БД, данные записываются в память, затем в физический файл (mdb), затем индексы обновляются. Это целых четыре шага в строке, которые вы пытаетесь выполнить. Хуже того, запись данных в физический файл занимает много времени.

Я думаю, что если вы используете другой подход, выполните эти четыре шага (подключение, память, запись данных, переиндексация) для всего набора данных, которые вы пытаетесь вставить. Итак, предположим, что вы добавляете 1000 записей, а не 4000 шагов (4x1000), вы можете сократить эту обработку до 1400 шагов обработки (1 соединение, сверхбыстрая запись в память 1000, 1 запись в файл данных, 1 пересмотр индекса). [ 112]

Следующий код дает приблизительное представление о том, о чем я говорю:

class Program
{
    static void Main(string[] args)
    {
        //memory-only list for data loading
        List<HeaderResult> mylist = new List<HeaderResult>(){ new HeaderResult("report1","desc of report","ete"), new HeaderResult("report2", "desc of report2", "ete2")};
        var tableForInsert = new DataTable();
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * from  HeaderResult", "my conneciton string")) {
            dataAdapter.Fill(tableForInsert);

            //now I have a live copy of the table into which I want to insert data
            //blast in the data
            foreach (HeaderResult hr in mylist) {
                tableForInsert.Rows.Add(hr);
            }

            //now all the data is written at once and sql will take care of the indexes after the datat's written
            dataAdapter.Update(tableForInsert);
        }
}

//class should have same fields as your table
class HeaderResult
{
    string report;
    string reportDescription;
    string etc;
    public HeaderResult(string rpt, string desc, string e)
    {
        report = rpt;
        reportDescription = desc;
        etc = e;
    }
}
5
задан djv 8 April 2013 в 17:47
поделиться

3 ответа

Значение ar.AsyncState значение результата, когда Вы первоначально передаете его BeginInvoke. То, что при передаче его Вы использовали значение result не означает, что это "связывается" с переменной результата. Это - просто значение result переменная, когда Вы передаете его для запуска с.

Видеть это, любой набор result к некоторому тестовому значению перед вызовом BeginInvoke, или просто передайте строковый литерал вместо этого. Так или иначе Вы получите то значение в обратном вызове.

С другой стороны, у Вашего обратного вызова и исходного делегата оба есть тот же целевой объект, таким образом, Вы могли использовать использование result в рамках обратного вызова и это имело бы значение, которое Вы хотите - это - другой способ поддержать состояние.

8
ответ дан 13 December 2019 в 22:16
поделиться

Это передается в том, когда Вы называете BeginInvoke. В то время результат является пустым. При установке результата перед вызовом Вы будете видеть его в обратном вызове.

1
ответ дан 13 December 2019 в 22:16
поделиться

Проблема состоит в том, что Вы передаете значение result - который (прежде чем doStuff) null. Обновления result в doStuff не влияйте на асинхронное состояние.

1
ответ дан 13 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: