# IAsyncAssetEntry

> An optional capability for an asset entry that loads its asset asynchronously.

## Definition

* **Type:** Interface
* **Namespace:** [Unity.Localization](/engine/6000.7/script-reference/unity/localization.md)
* **Assembly:** UnityEngine.LocalizationRuntimeModule

```csharp
public interface IAsyncAssetEntry : IAssetEntry, IResourceEntry
```

## Remarks

Implement this alongside [IAssetEntry](/engine/6000.7/script-reference/unity/localization/iassetentry.md) when the entry loads through an asynchronous operation, such as a Resources request or an Addressables handle. The localization system calls this on the asynchronous resolve paths. An entry that already has its asset in hand implements [ISynchronousAssetEntry](/engine/6000.7/script-reference/unity/localization/isynchronousassetentry.md) instead; the built-in entries are synchronous only.

Additional Resources: [IAssetEntry](/engine/6000.7/script-reference/unity/localization/iassetentry.md), [ISynchronousAssetEntry](/engine/6000.7/script-reference/unity/localization/isynchronousassetentry.md)

Load an asset entry and log the result.

## Examples

```csharp
using System.Threading;
using Unity.Localization;
using UnityEngine;
using Object = UnityEngine.Object;

namespace Unity.Localization.Samples
{
    public class AsyncAssetEntryExample : ResourceEntryBase, IAssetEntry, IAsyncAssetEntry
    {
        [SerializeField] string m_ResourcePath;

        public AsyncAssetEntryExample(long keyId, string resourcePath) : base(keyId) => m_ResourcePath = resourcePath;

        public bool HasAsset() => !string.IsNullOrEmpty(m_ResourcePath);

        public async Awaitable<Object> LoadAssetAsync(CancellationToken cancellationToken)
        {
            if (!HasAsset())
                return null;
            var request = Resources.LoadAsync<Object>(m_ResourcePath);
            await Awaitable.FromAsyncOperation(request, cancellationToken);
            return request.asset;
        }

        public void ReleaseAsset(Object asset) => Resources.UnloadAsset(asset);
    }

    public class IAsyncAssetEntryLoadAssetAsyncExample
    {
        public async Awaitable Run()
        {
            var shared = ScriptableObject.CreateInstance<SharedTableData>();
            IAsyncAssetEntry entry = new AsyncAssetEntryExample(shared.AddKey("banner").Id, "UI/banner");

            var asset = await entry.LoadAssetAsync(CancellationToken.None);
            if (asset != null)
            {
                Debug.Log(asset.name);
                entry.ReleaseAsset(asset);
            }
        }
    }
}
```

## Methods

| Method                                                                                                  | Description                             |
| ------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| [LoadAssetAsync](/engine/6000.7/script-reference/unity/localization/iasyncassetentry/loadassetasync.md) | Loads the asset assigned to this entry. |

## Inheritance

**Inherited Members:**

* [IAssetEntry.HasAsset()](/engine/6000.7/script-reference/unity/localization/iassetentry/hasasset.md)
* [IAssetEntry.ReleaseAsset(Object)](/engine/6000.7/script-reference/unity/localization/iassetentry/releaseasset.md)
* [IResourceEntry.KeyId()](/engine/6000.7/script-reference/unity/localization/iresourceentry/keyid.md)
* [IResourceEntry.Metadata()](/engine/6000.7/script-reference/unity/localization/iresourceentry/metadata.md)
* [IResourceEntry.Table()](/engine/6000.7/script-reference/unity/localization/iresourceentry/table.md)
* [IResourceEntry.SharedEntry()](/engine/6000.7/script-reference/unity/localization/iresourceentry/sharedentry.md)
