Код застревает при вставке запроса - PullRequest
0 голосов
/ 10 марта 2012

Я запускаю приложение Windows Form Base, я использую фоновый рабочий класс для httpwebrequest.Используя веб-браузер, оба сохраняют данные в таблицу Excel.Это работало нормально, или, может быть, это была удача, теперь я вижу, что когда-то код застревает в операторе вставки, он просто идет в

myCommand.ExecuteScalar();

не выходит. И через некоторое время я вижу это:

CLR не удалось перейти из контекста COM 0x7833a8 в контекст COM 0x7838b0 в течение 60 секунд.Поток, которому принадлежит целевой контекст / квартира, скорее всего, либо делает ожидание без перекачки, либо обрабатывает очень длительную операцию без перекачки сообщений Windows.Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или использование памяти постоянно увеличивается с течением времени.Чтобы избежать этой проблемы, все потоки однопотоковых квартир (STA) должны использовать примитивы перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.

Запрос, в котором он застревает:

try
{

    myCommand.CommandText = "Insert into [outputsheet$] (website,[facebook page],DealTitle,Dealtime,Dealprice,Dealvalue,Dealdiscount,Dealsaving,Linktitle,address,Category,[Type of Deal]) Values('" + 
        webaddress.Replace("'", "''") + "','" + facbookaddress.Replace("'", "''") + "','" + title.Replace("'", "''") + "','" + dealtime.Replace("'", "''") + "','" + 
        amount.Replace("'", "''") + "','" + value.Replace("'", "''") + "','" + discount.Replace("'", "''") + "','" + saving.Replace("'", "''") + "','" + 
        titleweb.Replace("'", "''") + "','" + address.Replace("'", "''") + "','" + categoryName.Replace("'", "''") + "','Now Deals')";
    myCommand.ExecuteScalar();

}
catch (Exception exp)
{

}

Пожалуйста, помогите, есть что-нибудь, что мне нужно сделать. Как избежать этого.Спасибо

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

Возможно, вы могли бы попытаться инкапсулировать ExecuteNonQuery в lock (), чтобы избежать возможности отправки запроса на excel, пока он занят выполнением предыдущего?

РЕДАКТИРОВАТЬ: пример

Если ваш код, который выполняет вставку, инкапсулирован в классе, вы бы сделали что-то вроде этого:

static private object thisLock = new object();

и позже:

lock(thisLock)
{
   myCommand.ExecuteNonQuery();
}

Я не занимался многопоточностью, так что, возможно, я не в порядке.

0 голосов
/ 10 марта 2012

Это может иметь какое-то отношение к MDA, как указано в сообщении на этом форуме Microsoft (несколько сообщений ниже, вроде как надо искать это): http://social.msdn.microsoft.com/forums/en-US/vsdebug/thread/8e04941e-32e1-4901-b360-4859106a5412

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...