c # остановите потоковый ридер через несколько секунд. Это возможно? - PullRequest
2 голосов
/ 03 августа 2010

У меня есть веб-запрос, и я читаю информацию с помощью Streamreader. Я хочу остановиться после этого считывателя через 15 секунд. Потому что иногда процесс чтения занимает больше времени, но иногда идет хорошо. Если процесс чтения занимает больше 15 секунд, как я могу его остановить? Я открыт всем идеям.

Ответы [ 3 ]

2 голосов
/ 03 августа 2010

Поскольку вы говорите «веб-запрос», я предполагаю, что потоковый ридер обернет System.IO.Stream, который вы получили от экземпляра HttpWebRequest, вызвав httpWebRequest.GetResponse().GetResponseStream().

взгляните на HttpWebRequest.ReadWriteTimeout.

1 голос
/ 03 августа 2010

Используйте System.Threading.Timer и установите событие галочки на 15 секунд.Это не самый чистый, но это будет работать.или, может быть, секундомер

- опция секундомера

        Stopwatch sw = new Stopwatch();
        sw.Start();
        while (raeder.Read() && sw.ElapsedMilliseconds < 15000)
        {

        }

- опция таймера

        Timer t = new Timer();
        t.Interval = 15000;
        t.Elapsed += new ElapsedEventHandler(t_Elapsed);
        t.Start();
        read = true;
        while (raeder.Read() && read)
        {

        }
    }

    private bool read;
    void t_Elapsed(object sender, ElapsedEventArgs e)
    {
        read = false;
    }
0 голосов
/ 03 августа 2010

Вам придется запустить задачу в другом потоке и отслеживать из основного потока, выполняется ли он дольше 15 секунд:

string result;
Action asyncAction = () =>
{
    //do stuff
    Thread.Sleep(10000); // some long running operation
    result = "I'm finished"; // put the result there
};

// have some var that holds the value
bool done = false;
// invoke the action on another thread, and when done: set done to true
asyncAction.BeginInvoke((res)=>done=true, null);

int msProceeded = 0;
while(!done)
{
    Thread.Sleep(100); // do nothing
    msProceeded += 100;

    if (msProceeded > 5000) break; // when we proceed 5 secs break out of this loop
}

// done holds the status, and result holds the result
if(!done)
{
    //aborted
}
else
{
    //finished
    Console.WriteLine(result); // prints I'm finished, if it's executed fast enough
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...