maui-linux/Xamarin.Forms.Core/Performance.cs

79 строки
2.0 KiB
C#

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System;
using System.Threading;
namespace Xamarin.Forms.Internals
{
[EditorBrowsable(EditorBrowsableState.Never)]
public interface IPerformanceProvider
{
void Stop(string reference, string tag, string path, string member);
void Start(string reference, string tag, string path, string member);
}
[EditorBrowsable(EditorBrowsableState.Never)]
public class Performance
{
static long Reference;
public static IPerformanceProvider Provider { get; private set; }
public static void SetProvider(IPerformanceProvider instance)
{
Provider = instance;
}
public static void Start(out string reference, string tag = null, [CallerFilePath] string path = null, [CallerMemberName] string member = null)
{
if (Provider == null)
{
reference = String.Empty;
return;
}
reference = Interlocked.Increment(ref Reference).ToString();
Provider.Start(reference, tag, path, member);
}
public static void Start(string reference, string tag = null, [CallerFilePath] string path = null,
[CallerMemberName] string member = null)
{
Provider?.Start(reference, tag, path, member);
}
public static void Stop(string reference, string tag = null, [CallerFilePath] string path = null, [CallerMemberName] string member = null)
{
Provider?.Stop(reference, tag, path, member);
}
internal static IDisposable StartNew(string tag = null, [CallerFilePath] string path = null, [CallerMemberName] string member = null)
{
return new DisposablePerformanceReference(tag, path, member);
}
class DisposablePerformanceReference : IDisposable
{
string _reference;
string _tag;
string _path;
string _member;
public DisposablePerformanceReference(string tag, string path, string member)
{
_tag = tag;
_path = path;
_member = member;
Start(out string reference, _tag, _path, _member);
_reference = reference;
}
public void Dispose()
{
Stop(_reference, _tag, _path, _member);
}
}
}
}