|
1 | 1 | using System; |
2 | 2 | using System.Collections.Concurrent; |
| 3 | +using System.ComponentModel; |
3 | 4 | using System.Runtime.InteropServices; |
4 | | -using System.Threading.Tasks; |
5 | 5 | using System.Windows.Forms; |
6 | 6 | using WireSockUI.Config; |
7 | 7 | using WireSockUI.Properties; |
@@ -40,10 +40,7 @@ internal class WireSockManager : IDisposable |
40 | 40 | private GCHandle _logPrinterHandle; |
41 | 41 |
|
42 | 42 | private readonly LogPrinter _logPrinter; |
43 | | - |
44 | 43 | private WgbLogLevel _logLevel; |
45 | | - private readonly Control _logControl; |
46 | | - private readonly LogMessageCallback _logMessageCallback; |
47 | 44 |
|
48 | 45 | /// <summary> |
49 | 46 | /// LogMessage function delegate |
@@ -142,7 +139,7 @@ public WgbLogLevel LogLevelSetting |
142 | 139 | { |
143 | 140 | get |
144 | 141 | { |
145 | | - switch (Properties.Settings.Default.LogLevel) |
| 142 | + switch (Settings.Default.LogLevel) |
146 | 143 | { |
147 | 144 | case "Info": |
148 | 145 | return WgbLogLevel.Info; |
@@ -207,37 +204,44 @@ private void PrintLog(string message) |
207 | 204 | } |
208 | 205 |
|
209 | 206 | /// <summary> |
210 | | - /// Initializes a new instance of the <see cref="WireSockManager" />. |
| 207 | + /// Initialize a <see cref="T:BackgroundWorker" /> which retrieves log messages from the logging queue |
211 | 208 | /// </summary> |
212 | | - /// <param name="logControl"><see cref="T:Control" /> owning the <paramref name="logMessageCallback"/></param> |
213 | | - /// <param name="logMessageCallback"><see cref="T:LogMessageCallback" /></param> |
214 | | - public WireSockManager(Control logControl = null, LogMessageCallback logMessageCallback = null) |
| 209 | + /// <param name="logMessageCallback"><see cref="T:LogMessageCallback" /> to call for each log message</param> |
| 210 | + /// <returns><see cref="T:BackgroundWorker" /></returns> |
| 211 | + private BackgroundWorker InitializeLogWorker(LogMessageCallback logMessageCallback) |
215 | 212 | { |
216 | | - _logQueue = new BlockingCollection<LogMessage>(new ConcurrentQueue<LogMessage>()); |
217 | | - _logControl = logControl; |
218 | | - _logMessageCallback = logMessageCallback; |
| 213 | + BackgroundWorker worker = new BackgroundWorker() |
| 214 | + { |
| 215 | + WorkerReportsProgress = true |
| 216 | + }; |
219 | 217 |
|
220 | | - Task.Run(() => |
| 218 | + worker.DoWork += (object s, DoWorkEventArgs e) => |
221 | 219 | { |
222 | | - try |
| 220 | + // Exit when the logQueue is done adding and empty |
| 221 | + while (!_logQueue.IsCompleted) |
223 | 222 | { |
224 | | - while (true) |
225 | | - { |
226 | | - LogMessage message = _logQueue.Take(); |
227 | | - |
228 | | - if (_logControl != null && _logMessageCallback != null) |
229 | | - { |
230 | | - if (_logControl.InvokeRequired) |
231 | | - _logControl.BeginInvoke(_logMessageCallback, new object[] { message }); |
232 | | - else |
233 | | - _logMessageCallback(message); |
234 | | - } |
235 | | - } |
| 223 | + LogMessage message = _logQueue.Take(); |
| 224 | + worker.ReportProgress(0, message); |
236 | 225 | } |
237 | | - catch (InvalidOperationException) |
238 | | - { |
239 | | - } |
240 | | - }); |
| 226 | + }; |
| 227 | + |
| 228 | + worker.ProgressChanged += (object s, ProgressChangedEventArgs e) => |
| 229 | + { |
| 230 | + if (e.UserState is LogMessage message) |
| 231 | + logMessageCallback(message); |
| 232 | + }; |
| 233 | + |
| 234 | + return worker; |
| 235 | + } |
| 236 | + |
| 237 | + /// <summary> |
| 238 | + /// Initializes a new instance of the <see cref="WireSockManager" />. |
| 239 | + /// </summary> |
| 240 | + /// <param name="logMessageCallback"><see cref="T:LogMessageCallback" /></param> |
| 241 | + public WireSockManager(LogMessageCallback logMessageCallback = null) |
| 242 | + { |
| 243 | + _logQueue = new BlockingCollection<LogMessage>(new ConcurrentQueue<LogMessage>()); |
| 244 | + InitializeLogWorker(logMessageCallback).RunWorkerAsync(); |
241 | 245 |
|
242 | 246 | this.TunnelMode = Mode.Transparent; |
243 | 247 |
|
|
0 commit comments