Здравствуйте!
Дамы и господа, ответьте бестолковому на один простой вопрос — я правильно понимаю, что методы, вызванные через асинхронные делегаты досрочно прибить невозможно?
Т.е., если грубо, хочется иметь возможность убить SQL запрос к серверу, если тот оказался на редкость тугодумным...
ps извините если вопрос задается в сотый раз... хотя в вашем поиске я такого вроде не нашел.
Антон.
Здравствуйте, anton_yp, Вы писали:
using System;
using System.Threading;
public class ThreadHolder
{
public Thread Thread;
}
public class Test
{
static void Main()
{
ThreadHolder th = new ThreadHolder();
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), th);
Thread.Sleep(100);
th.Thread.Abort();
Thread.Sleep(100);
}
static void ThreadProc(object state)
{
Console.WriteLine("Thread started");
((ThreadHolder)state).Thread = Thread.CurrentThread;
try
{
Thread.Sleep(Timeout.Infinite);
}
finally
{
Console.WriteLine("Thread ended");
}
}
}
... << RSDN@Home 1.1.2 beta 1 (Win32NT 5.1.2600.0) >>
Видимо надо было изначально запостить исходник...
[cut]
using System;
using System.Data;
using System.Threading;
using Oracle.DataAccess.Client;
using System.Windows.Forms;
using Oracle.DataAccess.Types;
namespace AsynchTest
{
public delegate DataTable AsyncFillDelegate (OracleCommand cmd);
/// <summary>
/// Summary description for AsynchDataset.
/// </summary>
public class AsynchTest
{
public DataTable AsynchFill (OracleCommand cmd)
{
DataTable tbl = new DataTable("testdatatable");
OracleDataAdapter adap = new OracleDataAdapter (cmd);
OracleConnection con = new OracleConnection ("user id=sysadm;password=oracle;data source=jupiter");
try
{
con.Open();
cmd.Connection = con;
adap.Fill (tbl);
return tbl;
}
catch (Exception e)
{
MessageBox.Show (e.ToString());
return null;
}
finally
{
con.Close ();
}
}
}
public class EntryPoint
{
public static void Main ()
{
AsynchTest at = new AsynchTest();
AsyncFillDelegate dlgt = new AsyncFillDelegate (at.AsynchFill);
IAsyncResult ar = dlgt.BeginInvoke(cmd, new AsyncCallback(CallbackMethod), dlgt2);
}
static void CallbackMethod(IAsyncResult ar)
{
AsyncFillDelegate dlgt = (AsyncFillDelegate)ar.AsyncState;
DataTable tblRet = dlgt.EndInvoke(ar);
}
}
}
[cut]
Т.е. проблема у меня во первых в том, что я пользую BeginInvoke и соответственно, вроде как не получаю в ответ никаких данных о треде.
А вторая проблема в том, что, как видно из кода, программа может подвиснуть на строчке "adap.Fill (tbl)", а это не sleep, оттуда управление так просто не вернется...даже по Thread.Abort.
Хочется понять как прибивать такие команды (видимо что-то типа SuperAbort — т.е. мочим, не глядя
Заранее спасибо, Антон.
Здравствуйте, anton_yp, Вы писали:
_>Т.е. проблема у меня во первых в том, что я пользую BeginInvoke и соответственно, вроде как не получаю в ответ никаких данных о треде.
Ну так и в моем примере в ответ никаких данных не получается.
_>А вторая проблема в том, что, как видно из кода, программа может подвиснуть на строчке "adap.Fill (tbl)", а это не sleep, оттуда управление так просто не вернется...даже по Thread.Abort.
Это уже проблемы CLR. Можешь либо дождаться возврата в менеджед код, тогда Abort сработает, либо грохнуть поток методами API, но тогда у тебя потечет память.
... << RSDN@Home 1.1.2 beta 2 >>