Skip to content

Commit 67ceabd

Browse files
Merge pull request #7 from brminnick/Release-1.1.0
Release 1.1.0
2 parents 4550911 + 292df67 commit 67ceabd

File tree

5 files changed

+35
-19
lines changed

5 files changed

+35
-19
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Extensions for `System.Threading.Tasks.Task`, inspired by [John Thiriet](https:/
88
- AsyncAwaitBestPractices
99
- An extension method to safely fire-and-forget a `Task`:
1010
- `SafeFireAndForget`
11+
- `WeakEventManager`
1112
- [Usage instructions below](#asyncawaitbestpractices)
1213
- AsyncAwaitBestPractices.MVVM
1314
- Allows for `Task` to safely be used asynchronously with `ICommand`:
@@ -60,6 +61,21 @@ async Task ExampleAsyncMethod()
6061
}
6162
```
6263

64+
An event implementation that enables the [garbage collector to collect an object without needing to unsubscribe event handlers](http://paulstovell.com/blog/weakevents):
65+
- `WeakEventManager`
66+
67+
```csharp
68+
readonly WeakEventManager _weakEventManager = new WeakEventManager();
69+
70+
public event EventHandler CanExecuteChanged
71+
{
72+
add => _weakEventManager.AddEventHandler(value);
73+
remove => _weakEventManager.RemoveEventHandler(value);
74+
}
75+
76+
public void RaiseCanExecuteChanged() => _weakEventManager.HandleEvent(this, EventArgs.Empty, nameof(CanExecuteChanged));
77+
```
78+
6379
### AsyncAwaitBestPractices.MVVM
6480

6581
Allows for `Task` to safely be used asynchronously with `ICommand`:

Src/AsyncAwaitBestPractices.MVVM.nuspec

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
33
<metadata minClientVersion="2.5">
44
<id>AsyncAwaitBestPractices.MVVM</id>
5-
<version>1.0.1</version>
5+
<version>1.1.0</version>
66
<title>Task Extensions for MVVM</title>
77
<authors>Brandon Minnick, John Thiriet</authors>
88
<owners>Brandon Minnick</owners>
@@ -14,12 +14,12 @@
1414
<summary>Includes AsyncCommand and IAsyncCommand which allows ICommand to safely be used asynchronously with Task.</summary>
1515
<tags>task,fire and forget, threading, extensions, system.threading.tasks,async,await</tags>
1616
<dependencies>
17-
<dependency id="AsyncAwaitBestPractices" version="1.0.1" />
17+
<dependency id="AsyncAwaitBestPractices" version="1.1.0" />
1818
</dependencies>
1919
<releaseNotes>
2020
New In This Release:
21-
- AsyncAwaitBestPractices.MVVM.AsyncCommand
22-
- AsyncAwaitBestPractices.MVVM.IAsyncCommand
21+
- Improved memory management
22+
- Implemented WeakEventManager for AsyncCommand.CanExecuteChanged
2323
</releaseNotes>
2424
<copyright>Copyright (c) 2018 Brandon Minnick</copyright>
2525
</metadata>

Src/AsyncAwaitBestPractices.MVVM/AsyncCommand.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public AsyncCommand(Func<T, Task> execute,
4343
/// </summary>
4444
public event EventHandler CanExecuteChanged
4545
{
46-
add { _weakEventManager.AddEventHandler(nameof(CanExecuteChanged), value); }
47-
remove { _weakEventManager.RemoveEventHandler(nameof(CanExecuteChanged), value); }
46+
add => _weakEventManager.AddEventHandler(value);
47+
remove => _weakEventManager.RemoveEventHandler(value);
4848
}
4949
#endregion
5050

@@ -135,8 +135,8 @@ public AsyncCommand(Func<Task> execute,
135135
/// </summary>
136136
public event EventHandler CanExecuteChanged
137137
{
138-
add { _weakEventManager.AddEventHandler(nameof(CanExecuteChanged), value); }
139-
remove { _weakEventManager.RemoveEventHandler(nameof(CanExecuteChanged), value); }
138+
add => _weakEventManager.AddEventHandler(value);
139+
remove => _weakEventManager.RemoveEventHandler(value);
140140
}
141141
#endregion
142142

Src/AsyncAwaitBestPractices.nuspec

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
33
<metadata minClientVersion="2.5">
44
<id>AsyncAwaitBestPractices</id>
5-
<version>1.0.1</version>
5+
<version>1.1.0</version>
66
<title>Task Extensions for System.Threading.Tasks</title>
77
<authors>Brandon Minnick, John Thiriet</authors>
88
<owners>Brandon Minnick</owners>
@@ -19,8 +19,7 @@
1919
<tags>task,fire and forget, threading, extensions, system.threading.tasks,async,await</tags>
2020
<releaseNotes>
2121
New In This Release:
22-
- Improved memory management
23-
- Implemented WeakEventManager
22+
- Added WeakEventManager
2423
</releaseNotes>
2524
<copyright>Copyright (c) 2018 Brandon Minnick</copyright>
2625
</metadata>

Src/AsyncAwaitBestPractices/WeakEventManager.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Reflection;
44

55
using static System.String;
6+
using System.Runtime.CompilerServices;
67

78
namespace AsyncAwaitBestPractices
89
{
@@ -17,10 +18,10 @@ public class WeakEventManager
1718
/// <summary>
1819
/// Adds the event handler
1920
/// </summary>
20-
/// <param name="eventName">Event name</param>
2121
/// <param name="handler">Handler</param>
22+
/// <param name="eventName">Event name</param>
2223
/// <typeparam name="TEventArgs">EventHandler type</typeparam>
23-
public void AddEventHandler<TEventArgs>(string eventName, EventHandler<TEventArgs> handler)
24+
public void AddEventHandler<TEventArgs>(EventHandler<TEventArgs> handler, [CallerMemberName] string eventName = "")
2425
where TEventArgs : EventArgs
2526
{
2627
if (IsNullOrWhiteSpace(eventName))
@@ -35,9 +36,9 @@ public void AddEventHandler<TEventArgs>(string eventName, EventHandler<TEventArg
3536
/// <summary>
3637
/// Adds the event handler
3738
/// </summary>
38-
/// <param name="eventName">Event name</param>
3939
/// <param name="handler">Handler</param>
40-
public void AddEventHandler(string eventName, EventHandler handler)
40+
/// <param name="eventName">Event name</param>
41+
public void AddEventHandler(EventHandler handler, [CallerMemberName] string eventName = "")
4142
{
4243
if (IsNullOrWhiteSpace(eventName))
4344
throw new ArgumentNullException(nameof(eventName));
@@ -96,10 +97,10 @@ public void HandleEvent(object sender, object args, string eventName)
9697
/// <summary>
9798
/// Removes the event handler
9899
/// </summary>
99-
/// <param name="eventName">Event name</param>
100100
/// <param name="handler">Handler</param>
101+
/// <param name="eventName">Event name</param>
101102
/// <typeparam name="TEventArgs">EventHandler type</typeparam>
102-
public void RemoveEventHandler<TEventArgs>(string eventName, EventHandler<TEventArgs> handler)
103+
public void RemoveEventHandler<TEventArgs>(EventHandler<TEventArgs> handler, [CallerMemberName] string eventName = "")
103104
where TEventArgs : EventArgs
104105
{
105106
if (IsNullOrEmpty(eventName))
@@ -114,9 +115,9 @@ public void RemoveEventHandler<TEventArgs>(string eventName, EventHandler<TEvent
114115
/// <summary>
115116
/// Removes the event handler.
116117
/// </summary>
117-
/// <param name="eventName">Event name</param>
118118
/// <param name="handler">Handler</param>
119-
public void RemoveEventHandler(string eventName, EventHandler handler)
119+
/// <param name="eventName">Event name</param>
120+
public void RemoveEventHandler(EventHandler handler, [CallerMemberName] string eventName = "")
120121
{
121122
if (IsNullOrEmpty(eventName))
122123
throw new ArgumentNullException(nameof(eventName));

0 commit comments

Comments
 (0)