Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,21 @@ await ConcurrentProcess.Create(
.LoopProcessAsync(cancellationToken: ct);
```

# Logging

You can enable logging by defining the following:
`UNITY_PROCESS_MANAGER_LOGGER`

```csharp
await ConcurrentProcess.CreateWithLog(
Logger, // Some Microsoft.Extensions.Logging implements class.(I recommend using ZLogger)
MoveToLicensesProcessProvider // Some IProcessProvider implements class.(This is the class you created)
)
.LoopProcessAsync(cancellationToken: cancellationToken);
```



## Installation ☘️
### Install via git URL
1. Open the Package Manager
Expand Down
29 changes: 29 additions & 0 deletions Runtime/ConcurrentProcess.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
using System.Threading;
using Cysharp.Threading.Tasks;

#if UNITY_PROCESS_MANAGER_LOGGER
using Microsoft.Extensions.Logging;
#endif

namespace TanitakaTech.UnityProcessManager
{
public readonly struct ConcurrentProcess
Expand All @@ -19,6 +23,31 @@ public static ConcurrentProcess Create(params Process[] processTasks)
return new ConcurrentProcess(processTasks);
}

public static ConcurrentProcess Create(params IProcessProvider[] processProviders)
{
return new ConcurrentProcess(processProviders.Select(processProvider => processProvider.Provide()).ToArray());
}

#if UNITY_PROCESS_MANAGER_LOGGER
public static ConcurrentProcess CreateWithLog(ILogger logger, params IProcessProvider[] processProviders)
{
return new ConcurrentProcess(
processProviders.Select(processProvider => processProvider.Provide()
.Wrap(Process.Create(waitTask: ct =>
{
logger.LogInformation("WaitTask processProvider: {0}", processProvider.GetType().Name);
return UniTask.CompletedTask;
},
onPassedTask: ct =>
{
logger.LogInformation("OnPassedTask processProvider: {0}",
processProvider.GetType().Name);
return UniTask.FromResult(ProcessContinueType.Continue);
})))
.ToArray());
}
#endif

public static ConcurrentProcess Create(params ConcurrentProcess[] concurrentProcesses)
{
return new ConcurrentProcess(
Expand Down
8 changes: 8 additions & 0 deletions Runtime/IProcessProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace TanitakaTech.UnityProcessManager
{
public interface IProcessProvider
{
Process Provide();
}
}

3 changes: 3 additions & 0 deletions Runtime/IProcessProvider.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions Runtime/Process.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,23 @@ public UniTask ToUniTask(CancellationToken cancellationToken)
});
}
}

public static class ProcessExtensions
{
public static Process Wrap(this Process process, Process wrapProcess)
{
return Process.Create(
waitTask: async ct =>
{
await wrapProcess.WaitTask(ct);
await process.WaitTask(ct);
},
onPassedTask: async ct =>
{
await wrapProcess.OnPassedTask(ct);
return await process.OnPassedTask(ct);
}
);
}
}
}
4 changes: 2 additions & 2 deletions Runtime/Request/RequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ public class RequestHandler<TRequest> :
private TRequest _requestValue;
private bool _isWaitingRequest = false;

void IRequestPusher<TRequest>.PushRequest(TRequest requestValue)
public void PushRequest(TRequest requestValue)
{
if (!_isWaitingRequest) return;

_isWaitingRequest = false;
_requestValue = requestValue;
}

async UniTask<TRequest> IRequestConsumer<TRequest>.WaitRequestAndConsumeAsync(CancellationToken cancellationToken)
public async UniTask<TRequest> WaitRequestAndConsumeAsync(CancellationToken cancellationToken)
{
_isWaitingRequest = true;
cancellationToken.Register(() => _isWaitingRequest = false);
Expand Down
36 changes: 36 additions & 0 deletions Runtime/Request/RequestHandlerWithLog.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#if UNITY_PROCESS_MANAGER_LOGGER
using System.Threading;
using Cysharp.Threading.Tasks;
using Microsoft.Extensions.Logging;

namespace TanitakaTech.UnityProcessManager
{
public class RequestHandlerWithLog<TRequest> :
IRequestPusher<TRequest>,
IRequestConsumer<TRequest> where TRequest : struct
{
private ILogger Logger { get; }
private RequestHandler<TRequest> RequestHandler { get; }

public RequestHandlerWithLog(ILogger logger)
{
Logger = logger;
RequestHandler = new RequestHandler<TRequest>();
}

void IRequestPusher<TRequest>.PushRequest(TRequest requestValue)
{
Logger.LogInformation($"PushRequest: {requestValue}");
RequestHandler.PushRequest(requestValue);
}

async UniTask<TRequest> IRequestConsumer<TRequest>.WaitRequestAndConsumeAsync(CancellationToken cancellationToken)
{
Logger.LogInformation("Start WaitRequestAndConsumeAsync");
var request = await RequestHandler.WaitRequestAndConsumeAsync(cancellationToken);
Logger.LogInformation($"End WaitRequestAndConsumeAsync request:{request}");
return request;
}
}
}
#endif
3 changes: 3 additions & 0 deletions Runtime/Request/RequestHandlerWithLog.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.