Skip to content

Commit eca36e6

Browse files
committed
Fixed issues AttackPattern#26, AttackPattern#31, AttackPattern#33 where running multiple instances cause various exceptions to be thrown.
1 parent 3580185 commit eca36e6

File tree

4 files changed

+32
-32
lines changed

4 files changed

+32
-32
lines changed

Source/CSharpAnalytics/AutoMeasurement/BaseAutoMeasurement.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,20 +202,20 @@ protected async Task StartRequesterAsync()
202202
/// Suspend the requester and preserve any unsent URIs.
203203
/// </summary>
204204
/// <returns>Task that completes when the requester has been suspended.</returns>
205-
protected async Task StopRequesterAsync()
205+
protected void StopRequesterAsync()
206206
{
207207
var safeBackgroundRequester = backgroundRequester;
208208
if (safeBackgroundRequester == null) return;
209209

210210
var recentRequestsToPersist = new List<Uri>();
211211
if (safeBackgroundRequester.IsStarted)
212212
{
213-
var pendingRequests = await safeBackgroundRequester.StopAsync();
213+
var pendingRequests = safeBackgroundRequester.StopAsync().GetAwaiter().GetResult();
214214
recentRequestsToPersist = pendingRequests.Skip(pendingRequests.Count - MaximumRequestsToPersist).ToList();
215215
}
216216

217-
await Save(recentRequestsToPersist, QueueStorageName);
218-
await Save(sessionManager.GetState(), SessionStorageName);
217+
Save(recentRequestsToPersist, QueueStorageName);
218+
Save(sessionManager.GetState(), SessionStorageName);
219219

220220
safeBackgroundRequester.Dispose();
221221
backgroundRequester = null;

Source/CSharpAnalytics/AutoMeasurement/WinFormsAutoMeasurement.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ protected override bool IsInternetAvailable()
105105
/// </summary>
106106
/// <param name="sender"></param>
107107
/// <param name="eventArgs"></param>
108-
private async void ApplicationOnExit(object sender, EventArgs eventArgs)
108+
private void ApplicationOnExit(object sender, EventArgs eventArgs)
109109
{
110110
UnhookEvents();
111-
await StopRequesterAsync();
111+
StopRequesterAsync();
112112
}
113113
}
114114
}

Source/CSharpAnalytics/AutoMeasurement/WpfAutoMeasurement.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,10 @@ protected override bool IsInternetAvailable()
114114
/// </summary>
115115
/// <param name="sender"></param>
116116
/// <param name="eventArgs"></param>
117-
private async void ApplicationOnExit(object sender, EventArgs eventArgs)
117+
private void ApplicationOnExit(object sender, EventArgs eventArgs)
118118
{
119119
UnhookEvents();
120-
await StopRequesterAsync();
120+
StopRequesterAsync();
121121
}
122122
}
123123
}

Source/CSharpAnalytics/Serializers/AppDataContractSerializer.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Reflection;
44
using System.Runtime.Serialization;
55
using System.Threading.Tasks;
6+
using System.Xml;
67

78
namespace CSharpAnalytics.Serializers
89
{
@@ -48,36 +49,32 @@ private static string GetDefaultFolderPath()
4849
public static async Task<T> Restore<T>(string filename = null, bool deleteBadData = false)
4950
{
5051
var serializer = new DataContractSerializer(typeof(T), new[] { typeof(DateTimeOffset) });
52+
var settings = new XmlReaderSettings { Async = true };
5153

5254
try
5355
{
5456
var file = GetFilePath<T>(filename);
55-
5657
try
5758
{
58-
using (var inputStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
59+
using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
60+
using (var xmlReader = XmlReader.Create(fileStream, settings))
5961
{
60-
if (inputStream.Length == 0)
61-
{
62-
return default(T);
63-
}
64-
65-
using (var memoryStream = new MemoryStream())
66-
{
67-
await inputStream.CopyToAsync(memoryStream);
68-
await inputStream.FlushAsync();
69-
memoryStream.Seek(0, SeekOrigin.Begin);
70-
71-
return (T)serializer.ReadObject(memoryStream);
72-
}
62+
await xmlReader.ReadAsync();
63+
return (T)serializer.ReadObject(xmlReader);
7364
}
7465
}
7566
catch (SerializationException)
7667
{
7768
if (deleteBadData)
7869
File.Delete(file);
79-
throw;
8070
}
71+
catch (XmlException)
72+
{
73+
if (deleteBadData)
74+
File.Delete(file);
75+
}
76+
77+
return default(T);
8178
}
8279
catch (FileNotFoundException)
8380
{
@@ -95,20 +92,23 @@ public static async Task<T> Restore<T>(string filename = null, bool deleteBadDat
9592
public static async Task Save<T>(T value, string filename = null)
9693
{
9794
var serializer = new DataContractSerializer(typeof(T), new[] { typeof(DateTimeOffset) });
98-
95+
var settings = new XmlWriterSettings { Indent = true, Async = true };
9996
var file = GetFilePath<T>(filename);
10097

101-
using (var memoryStream = new MemoryStream())
98+
try
10299
{
103-
serializer.WriteObject(memoryStream, value);
104-
105100
using (var fileStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
101+
using (var xmlWriter = XmlWriter.Create(fileStream, settings))
106102
{
107-
memoryStream.Seek(0, SeekOrigin.Begin);
108-
await memoryStream.CopyToAsync(fileStream);
109-
await fileStream.FlushAsync();
103+
serializer.WriteObject(xmlWriter, value);
104+
await xmlWriter.FlushAsync();
110105
}
111106
}
107+
catch (UnauthorizedAccessException)
108+
{
109+
System.Diagnostics.Debug.WriteLine(
110+
"Failed to save to {0}. You may have insufficient rights or a synchronization may be occuring.", file);
111+
}
112112
}
113113

114114
/// <summary>
@@ -125,4 +125,4 @@ private static string GetFilePath<T>(string filename)
125125
return Path.Combine(FolderPath, filename ?? typeof(T).Name);
126126
}
127127
}
128-
}
128+
}

0 commit comments

Comments
 (0)