Di seguito gli interventi pubblicati in questa sezione, in ordine cronologico.
Just posted on MSDN Forum...
It's since three weeks that sometimes my local installation of Visual Studio .NET 2010 editor changes the source code lines adding several decimal digits when I recode the function or subroutine content (with the CTRL-K, CTRL-D shortcuts for example):
CORRECT SOURCE
yrif1 += 0.05 * _currentScale
DrawScale(_currentScale, New Point2D(xrif1 + 0.2 * _currentScale, yrif1))
ALTERED SOURCE
yrif1 += 0.050000000000000003 * _currentScale
DrawScale(_currentScale, New Point2D(xrif1 + 0.20000000000000001 * _currentScale, yrif1))
If I delete the less significant digits, the editor adds them again, when the cursors leaves the source code line. Do I need to uncheck Pretty listing (reformatting) of code in the Options > Text Editor > Basic > VB Specific panel? I would like to
preserve such option, because it has always done a good job at reformatting the whole source code. I can't miss it.
It seems that behaviour started appearing in the last month, maybe some system patch. My system is a Windows 8.1 regular installation in Italian language and international settings are set as default.
Metodo molto sporco per cambiare il caporiga in un file scritto con System.IO.StreamWriter o la classe ereditata TextWriter. Ha il piccolo difetto che deve caricare l'intero file in memoria, pertanto valutate altre soluzioni, se quello può rappresentare un problema per il vostro caso.
Nel codice di qui sotto si passa dal caporiga Windows (Cr + Lf) a quello Unix (Lf):
Dim file As New System.IO.StreamReader(path)
Dim data As String
data = file.ReadToEnd().Replace(vbCrLf,vbLf)
file.Close()
Dim writer As New System.IO.StreamWriter(path, False)
writer.Write(data)
writer.Flush()
writer.Close()
Purtroppo la soluzione più banale sarebbe quella di cambiare la variabile d'ambiente:
System.Environment.NewLine = vbLf
ma tale variabile è readonly, quindi per implementare una soluzione elegante è necessario ricorrere a scrivere una classe che sovrascrive qualcosa di StreamWriter.
Sono incappato in questa eccezione con .NET Framework 4.0 e Winforms, usando un meccanismo di callback asincrona e thread pooling per la gestione del timeout:
System.InvalidOperationException was unhandled
Message=L'operazione di annullamento ha rilevato un contesto differente da quello applicato nell'operazione Set corrispondente. Probabilmente un contesto è stato Set nel thread e non è stato ripristinato (annullato).
in System.Threading.SynchronizationContextSwitcher.Undo()
in System.Threading.ExecutionContextSwitcher.Undo()
in System.Threading.ExecutionContext.runFinallyCode(Object userData,
Boolean exceptionThrown)
in System.Runtime.CompilerServices.RuntimeHelpers.ExecuteBackoutCodeHelper
(Object backoutCode, Object userData, Boolean exceptionThrown)
in System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup
(TryCode code, CleanupCode backoutCode, Object userData)
in System.Threading.ExecutionContext.RunInternal(ExecutionContext
executionContext, ContextCallback callback, Object state)
in System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
ContextCallback callback, Object state, Boolean ignoreSyncCtx)
in System.Threading.ExecutionContext.Run(ExecutionContext executionContext,
ContextCallback callback, Object state)
in System.Net.ContextAwareResult.Complete(IntPtr userToken)
in System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
in System.Net.HttpWebRequest.SetResponse(Exception E)
in System.Net.HttpWebRequest.SetAndOrProcessResponse(Object responseOrException)
in System.Net.ConnectionReturnResult.SetResponses(ConnectionReturnResult returnResult)
in System.Net.Connection.CompleteConnectionWrapper(Object request, Object state)
in System.Net.PooledStream.ConnectionCallback(Object owningObject,
Exception e, Socket socket, IPAddress address)
in System.Net.ServicePoint.ConnectSocketCallback(System.IAsyncResult)
in System.Net.LazyAsyncResult.Complete(IntPtr)
in System.Net.ContextAwareResult.Complete(IntPtr)
in System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
in System.Net.Sockets.Socket.ConnectCallback()
in System.Net.Sockets.Socket.RegisteredWaitCallback(System.Object, Boolean)
in System.Threading._ThreadPoolWaitOrTimerCallback.
PerformWaitOrTimerCallback(System.Object, Boolean)
Pare che in Microsoft non ne siano venuti a capo, ma al momento la soluzione pare essere la seguente:
- non invocare Application.DoEvents al di fuori del main thread del processo
- usare il l'invocazione tramite Invoke/BeginInvoke nel caso in cui l'evento scatenante risponda vero all'interrogazione myControl.InvokeRequired
In realtà il tamponamento maggiore al problema pare essere dato dall'instanziazione della callback assicurandosi di resettare il contesto di sincronizzazione:
Dim oldSyncContext As System.Threading.SynchronizationContext
oldSyncContext = System.Threading.SynchronizationContext.Current
System.Threading.SynchronizationContext.SetSynchronizationContext(Nothing)
myAsyncResult = myRequest.BeginGetResponse(AddressOf ReadResponseAsync, myRequest)
If (Not _doSynchronous) Then
System.Threading.ThreadPool.RegisterWaitForSingleObject(myAsyncResult.AsyncWaitHandle,
New System.Threading.WaitOrTimerCallback(AddressOf TimeoutAsync),
myRequest, timeoutMs, True)
End If
System.Threading.SynchronizationContext.SetSynchronizationContext(oldSyncContext)
Su stackoverflow.com ho trovato questo ottimo articolo e discussione.
Arriva in .NET Framework 4.5 la possibilità di scrivere codice molto più compatto nella gestione di codice asincrono grazie alle keyword async e await.
Questa novità sarà disponibile per C# 5.0 e per VB 11, dentro Visual Studio .NET 2012.
async void OpenWebPage()
{
WebClient client = new WebClient();
string html = await client.DownloadStringTaskAsync(new Uri("http://www.tencas.com/blog"));
this.content.Text = html;
}
Prima invece eravate più o meno costretti a scrivere due funzioni e a ricorrere ad un handler per la gestione dell'evento asincrono. In realtà è la TPL (Task Parallel Library) a farsi carico dello sdoppiamento del corpo dell'unica funzione in due funzioni separate, ma meno codice si scrive e più tempo si ha per altre cose.
void OpenWebPage()
{
WebClient client = new WebClient();
client.DownloadStringCompleted += client_DownloadStringCompleted;
client.DownloadStringAsync(new Uri("http://www.tencas.com/blog"));
}
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
string html = e.Result;
this.content.Text = html;
}
|