Hi Felipe,<br>
<br>
&nbsp; First, thank you.<br>
<br>
&nbsp; Second, yes, I did use a variable to do what you stated (it was
in the code fragments).&nbsp; When I found the abort() did not work all
the time, I set a variable to true, which caused my thread to abort.<br>
<br>
&nbsp; Now, in regards to programming practices.&nbsp; I believe you
are correct.&nbsp; I agree in principal with everything you
state.&nbsp; I typically practice those things, as unbelievable as that
might sound.&nbsp; I'm more into systems now, but I've written real
time sw for years.<br>
<br>
&nbsp; However, if you look at Microsoft's .NET programming in C#
examples and tutorials, their C# tutorial (see Microsoft .NET SDK, C#
Programming Reference, &quot;Threading Tutorial&quot;) on threads shows you to <br>
<br>
&nbsp; 1) Spin while thread is not alive<br>
&nbsp; 2) call abort for thread to be closed<br>
<br>
&nbsp;&nbsp; I agree that a sleep() is a good thing while waiting for
thread to start running.&nbsp; However, I thought one of the points of
&quot;managed&quot; code was to allow this sort of thing, not necessarily paying
attention to cpu loading issues, as well as memory issues?&nbsp; That
is why I swallowed MS's tutorial hook line and sinker.&nbsp; <br>
&nbsp;&nbsp;<br>
&nbsp; In any case, regardless of the efficacy of the program I've
written, the point that mono developers must ponder is that other
coders following my footsteps will code exactly the same way, the way
that Microsoft Tutorial states it should.&nbsp; When it fails to abort
under mono, but always aborts under .NET, they will claim it is a bug
in Mono.<br>
<br>
&nbsp; It does appear I overlooked a join() call, which forces the
first thread to deadlock until the abort happens.&nbsp; However, I
never had the problem of a failing abort in .NET.&nbsp; In this case, I
could care less if the thread aborted a few hundred milliseconds to one
second later than the main thread.<br>
<br>&nbsp; As I indicated earlier, I set a variable which caused my
routine to bail, causing the thread to naturally abort (similar to your
proposal, but more crude).&nbsp; This method will work in all versions,
.NET and Mono.<br>
<br>
&nbsp;&nbsp; I was wondering if perhaps the abort() routine in Mono
might need tweaking. I was assuming that in most cases, (except for
System.Managed and other issues of similar ilk) that Mono would
typically want to work the same way as .NET.<br>
<br>
&nbsp; I think Mono is great!&nbsp; I'm very, very happy to see
it.&nbsp; The work thus far has been astounding and
exciting.&nbsp;&nbsp; If the way abort() works is the one of the few
differences, I don't have any problems using Mono.&nbsp; It would need
to be documented, however, for future folks blindly following MS
recommendations.<br>
<br>
&nbsp; BTW, the original .NET code ran in Mono without recompile,
except for one small issue.&nbsp; I'm tracking down some other issues
now.<br>
<br>
<br>
thanks again,<br>
wade<br>
<br><div><span class="gmail_quote">On 4/4/06, <b class="gmail_sendername">Felipe Almeida Lessa</b> &lt;<a href="mailto:felipe.lessa@gmail.com">felipe.lessa@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Em Ter, 2006-04-04 ās 08:26 -0600, Wade Maxfield escreveu:<br>&gt; Hi,<br><br>Hi! Correct me if I'm wrong but...<br><br>&gt; /*doesn't always work ----&gt;*/&nbsp;&nbsp;&nbsp;&nbsp;Global.WebThread.Abort();<br><br>You shouldn't be using Thread.Abort
, right? AFAIK, this is a bad way of<br>killing threads.<br><br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!Global.WebThread.IsAlive);<br><br>Why do you make the CPU go to 100% here? At least some Sleep should be<br>better, no?<br><br>------<br>
<br>I didn't read all of your code, but I suspect you should be using<br>another thread abortion method. I have some code that uses a thread with<br>some web requests, and to abort it I do 2 things:<br><br>1) Create a variable that is marked false when I want the thread to die.
<br>The thread's code periodically checks for the variable.<br>2) Save the WebRequest on a private variable to try to abort it, if<br>possible.<br><br>The relevant abortion method:<br><br>public void Abort() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
this.aborted = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (this.abortable) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.webRequest.Abort();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.Log(this,
&quot;WebRequest aborted with (apparent) success!&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.Log(this,
&quot;WebRequest is not abortable.&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.Log(this,
&quot;Failed to abort the WebRequest:\n&quot; + e.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>The method name is &quot;Abort&quot; because this class does not derive from<br>Thread. Also, you can safely ignore all Logger::Log calls.
<br><br>abortable is a variable that is set to false when the code starts an<br>operation on the WebRequest that would probably crash the program if it<br>was aborted.<br><br>It's also worth noting that we just try to abort the WebRequest and
<br>ignore any exceptions -- the code will stop anyway sometime soon as we<br>set the aborted variable.<br><br>HTH,<br><br>--<br>Felipe.<br><br></blockquote></div><br>