Как убить поток из ThreadPool?
От: anton_yp  
Дата: 05.12.03 13:04
Оценка:
Здравствуйте!

Дамы и господа, ответьте бестолковому на один простой вопрос — я правильно понимаю, что методы, вызванные через асинхронные делегаты досрочно прибить невозможно?
Т.е., если грубо, хочется иметь возможность убить SQL запрос к серверу, если тот оказался на редкость тугодумным...

ps извините если вопрос задается в сотый раз... хотя в вашем поиске я такого вроде не нашел.

Антон.
Re: Как убить поток из ThreadPool?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.12.03 14:33
Оценка: 15 (2)
Здравствуйте, 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) >>
AVK Blog
Re[2]: Пардон, видимо не правильно объяснил
От: anton_yp  
Дата: 08.12.03 06:35
Оценка:
Видимо надо было изначально запостить исходник...

[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 — т.е. мочим, не глядя

Заранее спасибо, Антон.
Re[3]: Пардон, видимо не правильно объяснил
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.12.03 10:04
Оценка:
Здравствуйте, anton_yp, Вы писали:

_>Т.е. проблема у меня во первых в том, что я пользую BeginInvoke и соответственно, вроде как не получаю в ответ никаких данных о треде.


Ну так и в моем примере в ответ никаких данных не получается.

_>А вторая проблема в том, что, как видно из кода, программа может подвиснуть на строчке "adap.Fill (tbl)", а это не sleep, оттуда управление так просто не вернется...даже по Thread.Abort.


Это уже проблемы CLR. Можешь либо дождаться возврата в менеджед код, тогда Abort сработает, либо грохнуть поток методами API, но тогда у тебя потечет память.
... << RSDN@Home 1.1.2 beta 2 >>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.