Skip to content

Commit 79375db

Browse files
committed
Add CancellationToken overloads to Compile methods
1 parent c6ff488 commit 79375db

File tree

3 files changed

+109
-11
lines changed

3 files changed

+109
-11
lines changed

RazorEngineCore.Tests/TestCompileAndRun.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
namespace RazorEngineCore.Tests
1414
{
1515
using System.Runtime.InteropServices;
16+
using System.Threading;
1617

1718
[TestClass]
1819
public class TestCompileAndRun
@@ -728,6 +729,66 @@ @using TestAssembly
728729
Assert.AreEqual(expected, actual);
729730
}
730731

732+
[TestMethod]
733+
public void TestCompileCancellation_DynamicModel()
734+
{
735+
RazorEngine razorEngine = new RazorEngine();
736+
using (CancellationTokenSource cancellationSource = new CancellationTokenSource())
737+
{
738+
cancellationSource.Cancel();
739+
740+
Assert.ThrowsException<OperationCanceledException>(() =>
741+
{
742+
IRazorEngineCompiledTemplate template = razorEngine.Compile("Hello @Model.Name", null, cancellationSource.Token);
743+
});
744+
}
745+
}
746+
747+
[TestMethod]
748+
public async Task TestCompileCancellation_DynamicModelAsync()
749+
{
750+
RazorEngine razorEngine = new RazorEngine();
751+
using (CancellationTokenSource cancellationSource = new CancellationTokenSource())
752+
{
753+
cancellationSource.Cancel();
754+
755+
await Assert.ThrowsExceptionAsync<OperationCanceledException>(async () =>
756+
{
757+
IRazorEngineCompiledTemplate template = await razorEngine.CompileAsync("Hello @Model.Name", null, cancellationSource.Token);
758+
});
759+
}
760+
}
761+
762+
[TestMethod]
763+
public void TestCompileCancellation_TypedModel1()
764+
{
765+
RazorEngine razorEngine = new RazorEngine();
766+
using (CancellationTokenSource cancellationSource = new CancellationTokenSource())
767+
{
768+
cancellationSource.Cancel();
769+
770+
Assert.ThrowsException<OperationCanceledException>(() =>
771+
{
772+
IRazorEngineCompiledTemplate<TestTemplate1> template = razorEngine.Compile<TestTemplate1>("Hello @A @B @(A + B) @C @Decorator(\"777\")", null, cancellationSource.Token);
773+
});
774+
}
775+
}
776+
777+
[TestMethod]
778+
public async Task TestCompileCancellation_TypedModel1Async()
779+
{
780+
RazorEngine razorEngine = new RazorEngine();
781+
using (CancellationTokenSource cancellationSource = new CancellationTokenSource())
782+
{
783+
cancellationSource.Cancel();
784+
785+
await Assert.ThrowsExceptionAsync<OperationCanceledException>(async () =>
786+
{
787+
IRazorEngineCompiledTemplate<TestTemplate1> template = await razorEngine.CompileAsync<TestTemplate1>("Hello @A @B @(A + B) @C @Decorator(\"777\")", null, cancellationSource.Token);
788+
});
789+
}
790+
}
791+
731792
private static List<MetadataReference> GetMetadataReferences()
732793
{
733794
if (RuntimeInformation.FrameworkDescription.StartsWith(

RazorEngineCore/IRazorEngine.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
using System;
2+
using System.Threading;
23
using System.Threading.Tasks;
34

45
namespace RazorEngineCore
56
{
67
public interface IRazorEngine
78
{
8-
IRazorEngineCompiledTemplate<T> Compile<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null)
9+
IRazorEngineCompiledTemplate<T> Compile<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null)
910
where T : IRazorEngineTemplate;
10-
11-
Task<IRazorEngineCompiledTemplate<T>> CompileAsync<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null)
11+
12+
IRazorEngineCompiledTemplate<T> Compile<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken)
13+
where T : IRazorEngineTemplate;
14+
15+
Task<IRazorEngineCompiledTemplate<T>> CompileAsync<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null)
16+
where T : IRazorEngineTemplate;
17+
18+
Task<IRazorEngineCompiledTemplate<T>> CompileAsync<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken)
1219
where T : IRazorEngineTemplate;
13-
20+
1421
IRazorEngineCompiledTemplate Compile(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null);
15-
22+
23+
IRazorEngineCompiledTemplate Compile(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken);
24+
1625
Task<IRazorEngineCompiledTemplate> CompileAsync(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null);
26+
27+
Task<IRazorEngineCompiledTemplate> CompileAsync(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken);
1728
}
1829
}

RazorEngineCore/RazorEngine.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Linq;
55
using System.Text;
6+
using System.Threading;
67
using System.Threading.Tasks;
78
using Microsoft.AspNetCore.Razor.Language;
89
using Microsoft.CodeAnalysis;
@@ -15,6 +16,11 @@ namespace RazorEngineCore
1516
public class RazorEngine : IRazorEngine
1617
{
1718
public IRazorEngineCompiledTemplate<T> Compile<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null) where T : IRazorEngineTemplate
19+
{
20+
return Compile<T>(content, builderAction, cancellationToken: default);
21+
}
22+
23+
public IRazorEngineCompiledTemplate<T> Compile<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken) where T : IRazorEngineTemplate
1824
{
1925
IRazorEngineCompilationOptionsBuilder compilationOptionsBuilder = new RazorEngineCompilationOptionsBuilder();
2026

@@ -23,34 +29,54 @@ public IRazorEngineCompiledTemplate<T> Compile<T>(string content, Action<IRazorE
2329

2430
builderAction?.Invoke(compilationOptionsBuilder);
2531

26-
MemoryStream memoryStream = this.CreateAndCompileToStream(content, compilationOptionsBuilder.Options);
32+
MemoryStream memoryStream = this.CreateAndCompileToStream(content, compilationOptionsBuilder.Options, cancellationToken);
2733

2834
return new RazorEngineCompiledTemplate<T>(memoryStream, compilationOptionsBuilder.Options.TemplateNamespace);
2935
}
3036

3137
public Task<IRazorEngineCompiledTemplate<T>> CompileAsync<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null) where T : IRazorEngineTemplate
3238
{
33-
return Task.Factory.StartNew(() => this.Compile<T>(content: content, builderAction: builderAction));
39+
return CompileAsync<T>(content, builderAction, cancellationToken: default);
40+
}
41+
42+
public Task<IRazorEngineCompiledTemplate<T>> CompileAsync<T>(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken) where T : IRazorEngineTemplate
43+
{
44+
return Task.Factory.StartNew(() => this.Compile<T>(content: content, builderAction: builderAction, cancellationToken: cancellationToken));
3445
}
3546

3647
public IRazorEngineCompiledTemplate Compile(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null)
48+
{
49+
return Compile(content, builderAction, cancellationToken: default);
50+
}
51+
52+
public IRazorEngineCompiledTemplate Compile(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken)
3753
{
3854
IRazorEngineCompilationOptionsBuilder compilationOptionsBuilder = new RazorEngineCompilationOptionsBuilder();
3955
compilationOptionsBuilder.Inherits(typeof(RazorEngineTemplateBase));
4056

4157
builderAction?.Invoke(compilationOptionsBuilder);
4258

43-
MemoryStream memoryStream = this.CreateAndCompileToStream(content, compilationOptionsBuilder.Options);
59+
MemoryStream memoryStream = this.CreateAndCompileToStream(content, compilationOptionsBuilder.Options, cancellationToken);
4460

4561
return new RazorEngineCompiledTemplate(memoryStream, compilationOptionsBuilder.Options.TemplateNamespace);
4662
}
4763

4864
public Task<IRazorEngineCompiledTemplate> CompileAsync(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction = null)
4965
{
50-
return Task.Factory.StartNew(() => this.Compile(content: content, builderAction: builderAction));
66+
return CompileAsync(content, builderAction, cancellationToken: default);
67+
}
68+
69+
public Task<IRazorEngineCompiledTemplate> CompileAsync(string content, Action<IRazorEngineCompilationOptionsBuilder> builderAction, CancellationToken cancellationToken)
70+
{
71+
return Task.Factory.StartNew(() => this.Compile(content: content, builderAction: builderAction, cancellationToken: cancellationToken));
5172
}
5273

5374
protected virtual MemoryStream CreateAndCompileToStream(string templateSource, RazorEngineCompilationOptions options)
75+
{
76+
return CreateAndCompileToStream(templateSource, options, cancellationToken: default);
77+
}
78+
79+
protected virtual MemoryStream CreateAndCompileToStream(string templateSource, RazorEngineCompilationOptions options, CancellationToken cancellationToken)
5480
{
5581
templateSource = this.WriteDirectives(templateSource, options);
5682

@@ -74,7 +100,7 @@ protected virtual MemoryStream CreateAndCompileToStream(string templateSource, R
74100

75101
RazorCSharpDocument razorCSharpDocument = codeDocument.GetCSharpDocument();
76102

77-
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(razorCSharpDocument.GeneratedCode);
103+
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(razorCSharpDocument.GeneratedCode, cancellationToken: cancellationToken);
78104

79105
CSharpCompilation compilation = CSharpCompilation.Create(
80106
fileName,
@@ -105,7 +131,7 @@ protected virtual MemoryStream CreateAndCompileToStream(string templateSource, R
105131

106132
MemoryStream memoryStream = new MemoryStream();
107133

108-
EmitResult emitResult = compilation.Emit(memoryStream);
134+
EmitResult emitResult = compilation.Emit(memoryStream, cancellationToken: cancellationToken);
109135

110136
if (!emitResult.Success)
111137
{

0 commit comments

Comments
 (0)